java进程在完成后编写?
我有一个这样开始的过程:
Process process = new ProcessBuilder("sh", "-c", "mongod | tee /tmp/logfile.txt");
这个过程在被中断时会优雅地结束,写入输出流“dbexit:really exiting now”
所以稍后,我想杀了它:
InputStream inputStream = process.getInputStream()
Scanner scanner = new Scanner(inputStream).useDelimiter(Pattern.quote("dbexit: really exiting now"));
//pid taken from grep
Shell.runShellCommand("kill -2 " + pid).waitFor();
scanner.next()
此始终在我的机器上成功运行。但几乎从未在CI服务器上使用过。扫描仪。next()抛出:
java.util.NoSuchElementException: null
at java.util.Scanner.throwFor(Scanner.java:838)
at java.util.Scanner.next(Scanner.java:1347)
因此,在编写“dbexit:really exiting now”之前,进程似乎结束了(或者至少关闭了它的InputStream)。但是这个文本出现在/tmp/logfile.txt
的末尾。进程InputStream是否可能在仍在写入时关闭?而且它被写入了文件
# 1 楼答案
输入流被缓冲。您从缓冲区读取数据,这些数据是在进程终止之前写入的