我正在尝试运行.csh脚本并将其输出读入StringBuffer。 尽管从控制台运行脚本返回一些输出,但输出有时返回空。相同的运行流有时可以返回输出,有时不会返回输出,尽管进程启动的方式没有任何改变(相同的脚本,路径,参数),脚本也不会更改。 我没有得到任何例外。 什么可能导致输出现在正确/成功读取? 代码段是
public static String getOutpoutScript(Process p) {
InputStream outpout = p.getInputStream();
logger.info("Retrived script output stream");
BufferedReader buf = new BufferedReader(new InputStreamReader(outpout));
String line = "";
StringBuffer write = new StringBuffer();
try {
while ((line = buf.readLine()) != null) {
write.append(line);
}
} catch (IOException e) {
// do something
}
return write.toString().trim();
}
除了没有关闭流的事实不好,代码中的这个或其他东西可能会阻止在某些情况下正确读取输出吗?
感谢,
答案 0 :(得分:0)
如果您使用ProcessBuilder启动它,您可以combine the error stream into the output stream.这样,如果程序打印到stderr,您也可以捕获它。或者你可以读两个。另外,你可能不想使用readLine,如果程序最后没有打印行尾字符,你可能会被卡住一段时间。
答案 1 :(得分:0)
也许您必须将p.getInputStream()
替换为p.getOutputStream()
除此之外,有时进程可以阻止等待输入,因此您必须异步读写 - 一种可能的解决方案是使用不同的线程 - 例如一个线程正在读取,另一个正在写入,另一个正在监视该过程。
答案 2 :(得分:0)
如果您有错误,默认情况下会写入getErrorStream()。如果您遇到问题,我会确保您在某处阅读。
如果此流的缓冲区已满,则程序将停止,等待您阅读。
解决这些问题的一个简单方法是使用ProcessBuilder。redirectErrorStream(true)