我正在尝试编写一个将System.out重定向到JTextArea的程序(它不必是JTextArea),但是当我调用System.out.println(“ Test!”)时,输出到文本区域就像所以:
\n
st!
\n
我的OutputStream的代码:
package gui;
import java.awt.*;
import java.io.*;
import javax.swing.text.*;
public class LogOutputStream extends OutputStream
{
public void write(final int b) throws IOException
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
write0(b);
}
});
}
public void write(final byte[] b, final int off, final int len)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
write0(b, off, len);
}
});
}
public void write(final byte[] b)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
write0(b);
}
});
}
private void write0(int b)
{
Document doc = FernflowerGUI.frame.textArea.getDocument();
try
{
doc.insertString(doc.getLength(), String.valueOf((char)b), null);
}
catch(BadLocationException impossible)
{
}
}
private void write0(byte[] b, int off, int len)
{
Document doc = FernflowerGUI.frame.textArea.getDocument();
try
{
doc.insertString(doc.getLength(), new String(b, off, len), null);
}
catch(BadLocationException impossible)
{
}
}
private void write0(byte[] b)
{
write0(b, 0, b.length);
}
}
创建PrintStream的代码:
PrintStream ps = new PrintStream(new LogOutputStream(), true);
谁能告诉我地球上正在发生什么?
最佳答案
基本上,您的代码不是线程安全的。
您正在接受一个接受一个字节数组的同步调用,然后稍后再使用该字节数组,并假设它仍具有相同的内容。如果write()
的调用者在方法返回后立即覆盖字节数组中的数据怎么办?当您开始使用它时,您将没有正确的数据。
我将从您的String
调用中的字节数组中提取write
,然后在对String
的调用中使用该write0
。
(我个人也使用Writer
而不是OutputStream
-基本上,您要处理文本数据,而不是二进制数据。)
关于java - Java-具有自定义OutputStream的PrintStream上的异常行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16118191/