我应该关闭一条我没有创建的流吗?

时间:2017-10-26 12:01:20

标签: java inputstream outputstream

如果我有流(InputStream或OutputStream)我没有创建但是作为参数传递给我的方法,我应该关闭那个流吗?这是一个例子:

void method(InputStream in) {
    try {
    //Do something
    }
    finally {
        if(in != null) { 
        in.close();    //Is this needed and correct?
    }    
}

5 个答案:

答案 0 :(得分:3)

真的,“这取决于”。

作为一般规则,您不应该关闭您不负责打开的流,但要给出正确答案,我们必须了解上下文。

责任委托很可能要求您的方法使用关闭流 - 如果是这种情况,那么它应该在代码中是明确的。

如果您的方法名为readFromStreamAndClose(InputStream in),那么您的方法关闭流的事实非常明显。

如果您自己打开流,您可以随时使用try-with-resources块来为您关闭流 - 与创建时的抽象级别相同。在这种情况下 - 您的方法(在比打开流时更低的级别调用)不应该关闭流。

答案 1 :(得分:0)

我不认为JVM规范对此有任何保证。你真的应该最终关闭这些资源。

当进程结束时,操作系统将释放与其关联的所有资源(包括内存,文件句柄和网络套接字)。

有OS设施可以检查打开的文件和流

答案 2 :(得分:0)

不,你不必这样做,因为它可以在代码中的某个地方使用。

答案 3 :(得分:0)

您使用以下方法记录方法:“关闭流”并将名称方法更改为类似readAndClose。

或者创建一个参数boolean closeStream,如果为true则关闭。

此外,如果流不支持标记/搜索/重置,则没有理由将其保持打开状态。

答案 4 :(得分:0)

通常不建议关闭与该类无关的流。

以下是原因,

  1. 传递给该方法的流可以在其他地方使用。 可重用的流在java中可用。如果流被关闭了 不能重新开放和重复使用。
  2. 如果在关闭流时出现异常,则您不知道如何操作 处理那个。因为你正在处理一般的输入流和它 可能来自文件,网络等任何地方。
  3. 该类打开流负责关闭它。