2010-04-25 2 views
1

Каков правильный способ гарантировать доставку при использовании SwingWorker? Я пытаюсь перенаправить данные из InputStream в JTextArea, и я запускаю SwingWorker с помощью метода execute. Я думаю, что я следую примеру here, но я выхожу из результатов, дубликатов и общей бессмыслицы.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"); 
     } 
    } 
} 
+1

У вас работает более одного рабочего за раз? – TofuBeer

+0

Вы пробовали запустить его в Swing Dispatcher Thread? Если ваш поток ввода не работает медленно (> 1 с), я бы поместил его в DispatchThread. На самом деле недостаточно кода или контекста для выявления каких-либо проблем. –

+0

Одновременно запускается только один рабочий, и поток ввода будет принимать данные в течение нескольких часов. –

ответ

-1

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

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

-1 - прочитайте ответ API или Fred; вы создаете String с большим количеством символов NUL. – kdgregory

+0

Не совсем, обрезка позаботится об этом. Это может быть немного неэффективно, но это не то место, где мое узкое место вообще присутствует в этом приложении. is.read() занимает около 1 секунды, чтобы ответить, поэтому все, что я делаю в цикле, в основном бесплатное. Если бы я мог, я бы предпочел бы ваш комментарий для предварительной оптимизации. –

1

Вы должны использовать «Len» значение при создании строки:

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

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

BufferedReader reader = new BufferedReader(is); 
... 
String line = reader.readLine() 
Смежные вопросы