有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    输入流被缓冲。您从缓冲区读取数据,这些数据是在进程终止之前写入的