Неполные данные из потока - PullRequest
0 голосов
/ 16 января 2012

Я читаю данные из потока процесса.По сути, я запускаю процесс с использованием API Runtime.exec и получаю входной поток процесса.

Runtime rt = Runtime.getRuntime();
process = rt.exec("C:/cygwin/home/grec.exe");
InputStream is = process.getInputStream();

Затем я собираю выходные данные процесса как -

            BufferedReader in = new BufferedReader(is);         
            char[] ls = new char[s.available()];
            ls.read(ls);
            String output = new String(ls);

Однакокогда я печатаю вывод строки, я получаю -

  break [loc]     Add a breakpoint at [file:]line or template
  callflow [val]  Enable call flow tracing
  next            Execute the over instruction, stepping over calls
  over            Execute the current instruction hierarchy

Но фактический вывод -

  break [loc]     Add a breakpoint at [file:]line or template
  callflow [val]  Enable call flow tracing 
  next            Execute the over instruction, stepping over calls
  over            Execute the current instruction hierarchy
  print <xpath>   Print the value of an XPath expression
 profile [val]   Turn profiler on or off
 reload          Reload the script contents
 run             Restart the script
 step            Execute the next instruction, stepping into calls
 verbose         Turn on verbose (-v) output logging
 where           Show the backtrace of template calls
 quit            Quit debugger

То есть часть вывода усекается, ноКод не создает исключений.Я попытался увеличить размер BufferedReader, а также увеличить размер массива ls. Я затрудняюсь найти причину этого поведения.Любые намеки или указатели на то, что может быть причиной этого, будут высоко оценены.

Ответы [ 2 ]

1 голос
/ 16 января 2012

Используйте цикл для обработки всей информации и чтения до конца потока.

Inputstream.available () не делает то, что вы ожидали:

Возвращает оценка количества байтов, которые могут быть прочитаны (или пропущены) из этого входного потока без блокировки при следующем вызове метода для этого входного потока.

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available%28%29

1 голос
/ 16 января 2012

Вы делаете ошибку, предполагая, что available() говорит вам, сколько байтов / символов действительно доступно.На самом деле, он говорит вам, что по крайней мере , что многие из них доступны ... и это может быть неправильно, потому что это оценка.* после того, как вы завернули его в BufferedReader.Таким образом, вместо того, чтобы получать число символов , которое можно прочитать из считывателя, вы получаете количество доступных байтов , которые еще не были прочитаны в буфер.


Возможно, вам лучше просто читать из строки BufferedReader a, используя readLine().

...