java - Swingworker 产生重复输出/输出无序?

标签 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");
        }
    }
}

最佳答案

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

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

此外,我建议您将 InputStream 包装在 BufferedReader 中并使用“readLine()”方法:

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

关于java - Swingworker 产生重复输出/输出无序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2706736/

相关文章:

java - 子类的子类对成员的 protected 访问

java - 在 Java 中安全地遍历原始迭代器?

java - ExecutorService - 执行具有特定时间限制的每个任务

java - 为什么我的 JButton 显示为 JFrame 的完整大小?

Java GUI编程 : Setting the Fore/Background

java - ETable 对多列进行快速过滤

java - 如何从字符串中提取未知名称

java - Android:替换游标/sql 查询的值

c# - 在 WinForms 线程上使用 CoInitializeEx

multithreading - Lua 5.2.2线程中断系统