我正在从流程流中读取数据。基本上,我使用Runtime.exec API运行进程并获取进程输入流。
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的大小。我无法找到导致此行为的原因。关于可能导致这种情况的任何提示或指示都将受到高度赞赏。
答案 0 :(得分:1)
您错误地假设available()
告诉您实际可用的字节/字符数。事实上,它告诉你至少许多可用......并且它可能是错误的,因为它是一个估计。
然后,在将InputStream
包裹在BufferedReader
之后访问BufferedReader
时,您就会出现问题。因此,您无需获取可从读取器读取的字符的数量,而是获得尚未读入缓冲区的可用字节的数量。
您最好只使用readLine()
一次从{{1}}一行阅读。
答案 1 :(得分:1)
使用循环处理所有信息并读取直到流的末尾。
Inputstream.available()没有达到预期效果:
通过下次调用此输入的方法,返回估计值可以从此输入流读取(或跳过)而不阻塞的字节数流。
http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available%28%29