在Java中使用流时如何解决“流关闭”错误

时间:2019-02-17 12:52:46

标签: java filestream

问题是: 当我对以下代码运行声纳检查(以分析我的代码中的错误)时,它抱怨ClassA中的FileInputStream-> createFile()未关闭。 我了解这是资源泄漏,需要关闭。但是,如果我尝试使用资源或在finally块中关闭流, ClassB抱怨它在关闭时无法读取流。

解决此问题的最佳方法是什么?

代码块:

public ClassA{
    public ClassB createFile(){
        return new ClassB(new FileInputStream(new File("filePath")), revision, .. other arguments);
    }
}

public ClassB{
    public ClassB(InputStream fileInputStream, String revision, other arguments){
        // save the arguments in class variables. Do something with stream
    }
}

1 个答案:

答案 0 :(得分:1)

对于资源(您需要关闭的内容),您有三个选择:

1)您在此处创建它,然后在此处关闭它:使用try-with-resources构造。

2)您将资源传递给对象,然后该对象本身就是可关闭的资源;当该资源关闭时,它也会关闭其中的资源。

3)不推荐使用奇怪的东西,诸如声纳之类的短绒棉将其标记为有问题,难以调试等。

自然,您应该尽可能避免#3。

在这里,您似乎有两个可行的选择:

  1. 使ClassB实现AutoClosable,并使其以其close方法关闭该输入流,或者

  2. 不是传递输入流,而是传递可以从中派生输入流的thingie,以便使用它的ClassB代码可以执行try-with-resources事情。大概,您可能传递了Path或File对象,而不是InputStream。