0

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);

地球上で何が起こっているのか誰か教えてください。

4

1 に答える 1

1

基本的に、コードはスレッドセーフではありません。

バイト配列を受け入れる同期呼び出しを受け入れています-そして、後でそのバイト配列を使用していて、同じコンテンツがまだあると想定しています。write()メソッドが返された直後に、呼び出し元がバイト配列のデータを上書きするとどうなるでしょうか? 使い始める頃には、適切なデータが得られていません。

String呼び出しでバイト配列からを抽出し、それを への呼び出しでwrite使用します。Stringwrite0

(個人的にWriterは - ではなくOutputStream- を使用します。基本的には、バイナリ データではなく、テキスト データを処理する必要があります。)

于 2013-04-20T08:39:48.543 に答える