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

问题描述 投票:1回答:3

这是代码。

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。

thx all。

java inputstream
3个回答
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
}

0
投票

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

在java中,如果你指定

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

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


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 doc。

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

© www.soinside.com 2019 - 2024. All rights reserved.