Swingworker, производящий дублированный вывод / вывод из строя? - PullRequest
1 голос
/ 25 апреля 2010

Как правильно гарантировать доставку при использовании SwingWorker? Я пытаюсь направить данные из InputStream в JTextArea, и я запускаю свой SwingWorker с методом execute. Я думаю, что я следую примеру здесь , но я выхожу из порядка, дубликаты и общая ерунда.

Вот мой нерабочий 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 ]

1 голос
/ 25 апреля 2010

Вам нужно использовать значение 'len' при создании вашей строки:

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

Кроме того, я бы рекомендовал вам обернуть ваш InputStream в BufferedReader и использовать метод readLine ():

BufferedReader reader = new BufferedReader(is);
...
String line = reader.readLine()
0 голосов
/ 25 апреля 2010

Очистить массив данных после чтения из входного потока.

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