我有一个Java程序(包括其他东西)使用Input Stream从外部Python应用程序读取。
以下是我用来阅读它的代码:
InputStreamReader isr = new InputStreamReader(p.getInputStream()),
isrError = new InputStreamReader(p.getErrorStream());
BufferedReader br = new BufferedReader(isr), brError = new BufferedReader(isrError);
new Thread() {
@Override
public void run() {
try {
while (brError.readLine() != null);
} catch (Exception e) {
}
}
}.start();
while ((line = br.readLine()) != null) { //line is a previously declared String
//do whatever with line
}
我也创建了线程来读取错误流,因为Python应用程序在出现问题时会抛出错误(我无法编辑它,它是第三方软件),并且由于某种原因,最终InputStream会被阻止不要读ErrorStream。
有没有办法让while (brError.readLine() != null);
对性能的影响更小?
现在我正在研究使用VisualVM的性能,虽然Java软件通常保持在0-5%的CPU使用率之间,这非常好,但是这个循环使用了大约60-65%的用量线程,它唯一的功能是防止主循环阻塞。我需要尽可能地提高性能(这涉及到工业领域,因此正确使用资源非常重要)。
谢谢大家。
答案 0 :(得分:1)
为了便于处理(如果您在运行时不需要内容),请使用redirectError(File)
中的ProcessBuilder
。
ProcessBuilder pb = new ProcessBuilder("foo", "-bar");
pb.redirectError(new File("/tmp/errors.log"));
pb.start();
如果你从while (brError.readLine() != null);
获得cpu,你应该看一下错误流返回的内容。由于readLine()
是一个阻塞调用,这意味着错误流会输出很多行。
答案 1 :(得分:0)
你正在将丢弃的流转换为不必要的字符,这可能有点贵,特别是当你使用UTF-8时(取决于平台编码通常是错误的,无论如何)。
删除Reader
,使用BufferedInputStream
作为丢弃流。
但是,对于外部进程,重定向肯定是优越的,因为在Java中根本没有处理。