原文:https://stackoverflow.com/questions/39247784
在JavaFX中将SLF4J日志重定向到TextArea(Redirecting SLF4J log to TextArea in JavaFX)_电脑培训 (656463.com)
原问题答案输出中文时会出现乱码,将 继承自 FilterOutputStream 的 DelegatingOutputStream 类的 public void write(byte[] b) 方法重写为 out.write(b),在TextAreaOutputStream中重写write(byte[] b){ textArea.appendText((new String(b)));}即可
public class MyStaticOutputStreamAppender<E> extends OutputStreamAppender<E> {
private static final DelegatingOutputStream DELEGATING_OUTPUT_STREAM = new DelegatingOutputStream();
@Override
public void start() {
setOutputStream(DELEGATING_OUTPUT_STREAM);
super.start();
}
public static void setStaticOutputStream(OutputStream outputStream) {
DELEGATING_OUTPUT_STREAM.setOutputStream(outputStream);
}
private static class DelegatingOutputStream extends FilterOutputStream {
/**
* Creates a delegating output stream with a NO-OP delegate
*/
public DelegatingOutputStream(){
//在被替换之前使用的outputStream
super(new OutputStream() {
@Override
public void write(int b) {}
});
}
//重写FilterOutputStream的这个方法,否则appender调用writeBytes的时候还是会调FilterOutputStream的,无法调用TextAreaOutputStream重写的
@Override
public void write(byte[] b){
try {
out.write(b);
}catch (Exception e){
e.printStackTrace();
}
}
void setOutputStream(OutputStream outputStream) {
this.out = outputStream;
}
}
}
public class TextAreaOutputStream extends OutputStream {
private TextArea textArea;
public TextAreaOutputStream(TextArea textArea) {
this.textArea = textArea;
}
@Override
public void write(int b) {
Platform.runLater(() -> {
//用Platform.runLater来运行需要高频调用的方法 否则会出现textArea报空指针和下标越界
textArea.appendText(String.valueOf((char) b));
// 滚动到底部
textArea.setScrollTop(Double.MAX_VALUE);
});
}
@Override
public void write(byte[] b) {
Platform.runLater(() -> {
//用Platform.runLater来运行需要高频调用的方法 否则会出现textArea报空指针和下标越界
textArea.appendText((new String(b)));
// 滚动到底部
textArea.setScrollTop(Double.MAX_VALUE);
});
}
}