Java BufferedReader readLine()方法花费了太多时间

Java BufferedReader readLine()方法花费了太多时间,java,process,bufferedreader,Java,Process,Bufferedreader,我从进程中获取InputStream并通过BufferedReader读取它。虽然在while循环中,br只有一条线路,但几乎需要1分钟。我通过在前后打印来检查这一点,如下面的代码所示 String[] sendCommand = { "/bin/bash", "/Users/apple/Downloads/yowsup-e56f2d28f38c7961a2ccf7df588462f1c9588edf/sendmessage.sh"}; ProcessBuilder processBuilder

我从进程中获取InputStream并通过BufferedReader读取它。虽然在while循环中,br只有一条线路,但几乎需要1分钟。我通过在前后打印来检查这一点,如下面的代码所示

String[] sendCommand = { "/bin/bash", "/Users/apple/Downloads/yowsup-e56f2d28f38c7961a2ccf7df588462f1c9588edf/sendmessage.sh"};
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.directory(new File("/Users/apple/Downloads/yowsup-e56f2d28f38c7961a2ccf7df588462f1c9588edf"));
processBuilder.environment().put("PYTHONPATH", "/Users/apple/Downloads/yowsup-e56f2d28f38c7961a2ccf7df588462f1c9588edf");
processBuilder.command(sendCommand);

Process process = processBuilder.start();
process.waitFor();  
InputStream stream = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String temp = null;
System.out.println("before");
long start_time = System.currentTimeMillis();
while ((temp = br.readLine()) != null) 
{
    str = temp;
}
long end_time = System.currentTimeMillis();
long time_taken = end_time-start_time;
System.out.println("after");
System.out.println("Time taken in while loop: "+time_taken/1000);
结果是:

before
after
Time taken in while loop: 67

我想提高所用的时间,因为1分钟非常慢。可能的选择是什么?是否取决于我使用的流程?请帮帮我。

这不是阅读,而是写作
BufferedReader
的速度不能超过生成输出的速度。如果没有什么可读的,它就会阻塞。你看错了方向


注意,你的循环基本上是毫无意义的,或者充其量是非常奇怪的。你在阅读这个过程中产生的每一行,除了最后一行,你把所有的都扔掉了。当然,你应该对每一行都做些什么?

那么流程是什么呢?我非常怀疑这是由于进程的操作,而不是
BufferedReader
。如果从命令行或shell运行进程并观察它,会发生什么?您还应该添加一些指示,表明它实际上只是在读取一行—请注意,在流程本身完成之前,循环不会完成,因为此时流将关闭,
readLine()
将返回null。在此之前,我的流程正在运行bash脚本。但是为什么while循环需要时间呢?@DarshilBabel这个过程需要多长时间才能完成?因为这个过程大概需要时间。再次说明:如果从shell运行它会发生什么?我怀疑您会发现完成此过程只需一分钟以上……当您手动运行此过程时,是否需要键入任何内容?它是否将任何内容打印到stderr/System.err?实际上,我只需要BufferedReader的最后一行。我不知道怎么读最后一行。@NwDx你真的读过这个问题吗?这是另一个进程的stdout。@DarshilBabel好吧,您正在读取最后一行,正确获取它的唯一方法是读取到流的结尾,而获取流的结尾的唯一方法是在
readLine()
中阻塞,直到进程关闭其
stdout、
或退出,因此无法进行任何改进。