1

SwingWorkerを使用するときに配信を保証する適切な方法は何ですか?InputStreamからJTextAreaにデータをルーティングしようとしていますが、このexecuteメソッドを使用してSwingWorkerを実行しています。私はここの例に従っていると思いますが、結果が乱れ、重複し、一般的に意味がありません。

これが私の機能していないSwingWorkerです:

class InputStreamOutputWorker extends SwingWorker<List<String>,String> {

    private InputStream is;
    private JTextArea output;

    public InputStreamOutputWorker(InputStream is, JTextArea output) {
        this.is = is;
        this.output = output;
    }

    @Override
    protected List<String> doInBackground() throws Exception {
        byte[] data = new byte[4 * 1024];
        int len = 0;

        while ((len = is.read(data)) > 0) {
            String line = new String(data).trim();
            publish(line);
        }

        return null;
    }

    @Override
    protected void process( List<String> chunks )
    {
        for( String s : chunks )
        {
            output.append(s + "\n");
        }
    }
}
4

2 に答える 2

1

文字列を作成するときは、「len」値を使用する必要があります。

String line = new String(data,0,len).trim();

また、InputStream を BufferedReader でラップし、「readLine()」メソッドを使用することをお勧めします。

BufferedReader reader = new BufferedReader(is);
...
String line = reader.readLine()
于 2010-04-25T01:50:08.517 に答える
-1

入力ストリームから読み取った後、データ配列をクリアします。

while ((len = is.read(data)) > 0) {
                String line = new String(data).trim();
                publish(line);
                Arrays.fill(data,(byte)0);
}
于 2010-04-25T01:26:30.040 に答える