这是代码。
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。
是的,你需要在每个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
}
每次使用InputStream完成后都必须关闭。
在java中,如果你指定
fis = new FileInputStream(new File("D:\\za180s.ser"));
fis将指向新对象,因此当您调用fis.close()时,旧流不受影响。并且没有办法关闭它。
你需要每次调用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