概要

Loggerのログ出力をJTextAreaに表示するためのOutputStreamStreamHandlerを作成します。

サンプルコード

class TextAreaOutputStream extends OutputStream {
  private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
  private final JTextArea textArea;

  protected TextAreaOutputStream(JTextArea textArea) {
    super();
    this.textArea = textArea;
  }

  @Override public void flush() throws IOException {
    textArea.append(buffer.toString("UTF-8"));
    buffer.reset();
  }

  // // Java 10:
  // @Override public void flush() {
  //   textArea.append(buffer.toString(StandardCharsets.UTF_8));
  //   buffer.reset();
  // }

  @Override public void write(int b) {
    buffer.write(b);
  }

  @Override public void write(byte[] b, int off, int len) {
    buffer.write(b, off, len);
  }
}
View in GitHub: Java, Kotlin

解説

  • TextAreaOutputStream
    • ByteArrayOutputStreamを使用してJTextAreaに一行ずつ書き込みを行う
    • これをSystem.setOut(new PrintStream(new TextAreaOutputStream(textArea), true, "UTF-8"));のように標準出力ストリームに割り当てるとSystem.out.println(...)などで改行文字が書き込まれたときにバッファのflush()が呼び出され、textArea.append(buf.toString("UTF-8"));メソッドでJTextAreaに文字列が追記される
  • TextAreaHandler
    • ログ出力を上記のTextAreaOutputStreamなどに割り当てるため、StreamHandlerを継承するTextAreaHandlerを作成しLogger#addHandler(...)で設定
    • StreamHandler#getEncoding()をオーバーライドしてエンコーディングをUTF-8に設定
    • StreamHandler#publish(...)StreamHandler#close(...)をオーバーライドしてflush()を実行
      class TextAreaHandler extends StreamHandler {
        public TextAreaHandler(OutputStream os) {
          super(os, new SimpleFormatter());
        }
      
        @Override public String getEncoding() {
          return StandardCharsets.UTF_8.name(); // "UTF-8";
        }
      
        // @see java/util/logging/ConsoleHandler.java
        @Override public void publish(LogRecord record) {
          super.publish(record);
          flush();
        }
      
        @Override public void close() {
          flush();
        }
      }
      

参考リンク

コメント