gpt4 book ai didi

Java prog 通过管道传输并立即返回

转载 作者:搜寻专家 更新时间:2023-11-01 03:22:10 25 4
gpt4 key购买 nike

我有一个打印到标准输出的 Java 程序。例如,如果输出通过管道传输到 head,则 head 完成其工作后 shell 不会立即返回,而是等待 Java 程序完成其所有工作。

所以我的问题是:如何编写 Java 程序以便 shell 立即返回,就像 cat ... |头?

这是我的意思的一个例子:

此处 shell 立即返回,因为 head 没有时间打印前十行,无论 bigfile.txt 有多大:

time cat bigfile.txt | head
...
real 0m0.079s
user 0m0.001s
sys 0m0.006s

在这里,前十行被快速打印出来,但是 shell 直到所有文件都处理完才返回:

time java -jar DummyReader.jar bigfile.txt | head
...
real 0m18.720s
user 0m16.936s
sys 0m2.212s

DummyReader.jar 尽可能简单:

import java.io.*;

public class DummyReader {

public static void main(String[] args) throws IOException {

BufferedReader br= new BufferedReader(new FileReader(new File(args[0])));
String line;
while((line= br.readLine()) != null){
System.out.println(line);
}
br.close();
System.exit(0);
}

}

我的设置:

java -version
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-10M4609)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode)

在 MacOS 10.6.8 上

最佳答案

这只是因为您在 println 调用后没有检查错误。这是一个确实停止的修订版本。不过,它会更慢,因为 checkError() 会刷新到目前为止已缓冲的所有输出。

可能还有其他方法可以在不降低速度的情况下获得有关错误的通知。我看过一些明确处理 SIGPIPE 信号的代码,但我不知道这是否是最好的方法。

import java.io.*;

public class DummyReader {

public static void main(String[] args) throws IOException {

BufferedReader br= new BufferedReader(new FileReader(new File(args[0])));
String line;
int linecount = 0;
while((line= br.readLine()) != null){
System.out.println(line);
if (System.out.checkError())
{
System.err.println("Got some sort of error in the output stream");
break;
}
linecount++;
}
br.close();
System.err.println("Read " + linecount + " lines.");
System.exit(0);
}

}

关于Java prog 通过管道传输并立即返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27590307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com