我是否需要在每个新输入流上调用close()?

时间:2019-03-11 09:11:21

标签: java inputstream

这是代码。

public static void main(String[] args) throws IOException {

    FileInputStream fis = null;

    fis = new FileInputStream(new File("D:\\za180s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za185s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za186s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za187s.ser"));
    // do something
    fis.close();

}

问题是:需要我在每次“做某事”之后调用fis.close()方法,还是我毕竟只调用一次fis.close()。

忽略finally是否在close()位置,并且代码是否需要try catch。

全部。

3 个答案:

答案 0 :(得分:7)

是的,您需要对每个单独的InputStream进行平仓。代码的问题在于,每次创建新的流时,都要重新分配变量fis。换句话说:fis不再指向旧的InputStream,因此调用close不会关闭前一个流。

有关更多信息,请选中https://stackoverflow.com/a/40523/8819761

您还可以使用Java 7的try-with-resources语法,一旦退出try块,该语法将自动关闭流:

try (InputStream fis = new FileInputSteam(yourFile)) {
  // Do something
}

try (InputStream fis = new FileInputSteam(yourFile)) {
  // Do something else
}

答案 1 :(得分:0)

每次使用InputStream完成时,都必须关闭。

在Java中,如果您分配

 fis = new FileInputStream(new File("D:\\za180s.ser"));

fis将指向新对象,因此当您调用fis.close()时,旧流不会受到影响。而且没有办法将其关闭。

答案 2 :(得分:0)

您每次都需要调用close方法,但是现在不必担心。在Java SE 7中,您可以使用try-with-resources。根据Java-Oracle Doc

  

try-with-resources语句是一个try语句,它声明一个   或更多资源。资源是必须在之后关闭的对象   程序完成。 try-with-resources语句   确保在语句末尾关闭每个资源。任何   实现java.lang.AutoCloseable的对象,其中包括所有   实现java.io.Closeable的对象可以用作资源。

请查看示例。

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

在此示例中,在try-with-resources语句中声明的资源是BufferedReader。声明语句出现在try关键字之后的括号内。 Java SE 7和更高版本中的BufferedReader类实现接口java.lang.AutoCloseable。因为BufferedReader实例是在try-with-resource语句中声明的,所以无论try语句是正常完成还是突然完成(由于BufferedReader.readLine方法抛出IOException),它都会关闭。

有关更多详细信息,请查看try-with-resources的Oracle-Java文档。

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html