从 getInputStream 正确关闭 Java Process InputStream

2022-09-01 03:20:16

我无法在文档中找到对此的澄清。但是当我们有一个对象并调用时,ProcessgetInputStream()

我们是否得到了一个新的流,当我们完成它时,我们应该明确关闭它?还是我们得到已经存在的流,与进程相关联,我们不应该关闭,但进程将负责关闭它?

基本上,我们应该如何与从中获得的流进行交互?关闭还是不关闭?Process.getInputStream()


答案 1

通过阅读UNIXProcess.java,发生的事情是这样的:

我们需要区分两种状态:要么过程仍然活着,要么已经死亡。

如果进程处于活动状态,则通过关闭 OutputStream(转到进程的 stdin),您将告诉进程它没有更多的输入。通过关闭 InputStreams(stdout,进程的 stderr),进程不再写入这些(如果它尝试,它将获得 SIGPIPE)。

当进程死亡时,Java将缓冲来自stdout/stderr的剩余数据,并为您关闭所有三个流(它正在运行“进程收割者”线程,该线程在进程死亡时收到通知)。任何写入 OutputStream 的尝试都将失败。从 InputStream 读取将返回缓冲数据(如果有)。关闭其中任何一个都没有好处,但也不会造成伤害。(此时基础文件描述符已关闭)。


答案 2

我的第一反应是关闭它,你总是关闭你打开的流。我确实意识到文档没有达到标准,但是由于他们没有明确说明不要关闭,对我来说意味着遵循良好的编程实践。

InputStream is = process.getInputStream()
try {
    // your code
} finally {
    try { is.close(); } catch (Exception ignore) {}
}

如果你需要确保这没有问题,只需编写一个快速测试用例,每次打开和关闭输入流时,你都会从输入流中好几十次。


推荐