【发布时间】:2018-12-12 02:16:09
【问题描述】:
我正在向标准输出写入大量数据,并且我注意到根据输出控制台,程序执行时间是可变的。例如,该程序在 NetBeans 控制台上比在 Windows cmd 中慢。
所以我认为写入 stdout 会填充缓冲区,并且当该缓冲区已满时写入会阻塞(控制台输出消耗的速度不够快)。
我用 Java 程序重现了这种行为。
这是一个输出数据的程序。
public class Output {
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10_000; i++) {
System.out.println("Awesone Output ");
}
System.out.println("Total time : " + (System.currentTimeMillis() - start));
}
}
这里有一个使用上述程序数据的程序
public class StdoutBlocking {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder processBuilder = new ProcessBuilder("java", "stackoverflowDemo.StdoutBlocking.Output");
processBuilder.directory(new File("C:/Users/me/Documents/NetBeansProjects/tmp/build/classes"));
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
String lastLine = null;
while ((line = reader.readLine()) != null) {
Thread.sleep(10);
lastLine = line;
}
System.out.println("done : " + lastLine);
}
}
我启动第二个启动输出并消耗它的输出。 没有睡眠,输出程序真的很快,但很慢。
那么这个缓冲区的大小是多少??
这只是为了我的好奇心,我并没有试图实现特定的目标
【问题讨论】:
-
我想知道它是否记录在任何地方,具体取决于操作系统