这是代码。
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。
全部。
答案 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