Swingworker无序生成重复的输出/输出?

时间:2010-04-25 00:48:08

标签: java multithreading swing swingworker

使用SwingWorker时保证交付的正确方法是什么?我正在尝试将数据从InputStream路由到JTextArea,并且我正在使用execute方法运行我的SwingWorker。我想我正在关注示例here,但我的结果,副本和一般的废话都没有了。

这是我的非工作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");
        }
    }
}

2 个答案:

答案 0 :(得分:1)

创建字符串时需要使用'len'值:

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

另外,我建议你将InputStream包装在BufferedReader中并使用'readLine()'方法:

BufferedReader reader = new BufferedReader(is);
...
String line = reader.readLine()

答案 1 :(得分:-1)

从输入流中读取后清除数据数组。

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