我有一个Java程序,它(包括其他东西)使用输入流从外部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最终会被阻塞。你知道吗
有没有办法让while (brError.readLine() != null);
对性能的影响更小?你知道吗
现在我正在研究VisualVM的性能,虽然Java软件通常保持在0-5%的CPU使用率之间,这很不错,但是大约60-65%的CPU使用率被这个线程中的这个循环使用,它的唯一功能是防止主循环阻塞。我需要尽可能地提高性能(这将进入工业生产线,因此正确使用资源非常重要)。你知道吗
谢谢大家。你知道吗
您将丢弃流转换为不必要的字符,这可能有点昂贵,尤其是在使用UTF-8时(无论如何,这取决于平台编码通常是错误的)。你知道吗
删除
Reader
,使用BufferedInputStream
作为丢弃流。你知道吗但是,对于外部进程,重定向肯定是优越的,因为Java中根本没有处理。你知道吗
为便于处理(如果运行时不需要内容),请使用
ProcessBuilder
中的redirectError(File)
。你知道吗如果您正从
while (brError.readLine() != null);
获得cpu旋转,那么应该查看错误流返回的内容。因为readLine()
是一个阻塞调用,这意味着错误流将输出大量的行。你知道吗相关问题 更多 >
编程相关推荐