---
category: swing
folder: TextAreaOutputStream
title: JTextAreaにLoggerのログを出力する
tags: [JTextArea, OutputStream, StreamHandler, Logger]
author: aterai
pubdate: 2015-02-16T00:00:51+09:00
description: Loggerのログ出力をJTextAreaに表示するためのOutputStreamとStreamHandlerを作成します。
image: https://lh3.googleusercontent.com/-SjJO0dTl1jg/VOChTiK0lPI/AAAAAAAANw4/elD2Gb4uBd0/s800/TextAreaOutputStream.png
hreflang:
href: https://java-swing-tips.blogspot.com/2015/02/logging-into-jtextarea.html
lang: en
---
* Summary [#summary]
`Logger`のログ出力を`JTextArea`に表示するための`OutputStream`と`StreamHandler`を作成します。
#download(https://lh3.googleusercontent.com/-SjJO0dTl1jg/VOChTiK0lPI/AAAAAAAANw4/elD2Gb4uBd0/s800/TextAreaOutputStream.png)
* Source Code Examples [#sourcecode]
#code(link){{
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);
}
}
}}
* Description [#explanation]
* Description [#description]
- `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()`を実行
#code{{
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();
}
}
}}
* Reference [#reference]
- [https://community.oracle.com/thread/1366824 System.out.println() Print to JFrame | Oracle Community]
- [http://www.dreamincode.net/forums/topic/117537-external-program-output-to-jtextarea/ External Program Output To JTextArea - Java | Dream.In.Code]
- [https://altcla.hatenadiary.org/entry/20091029/1256824750 標準出力を JTextArea に出力する - As I like it.]
- [https://tips4java.wordpress.com/2008/11/08/message-console/ Message Console « Java Tips Weblog]
* Comment [#comment]
#comment
#comment