我使用以下代码使用相同的变量读取两个文件:
try {
FileInputStream fis = new FileInputStream(filename1);
InputStreamReader isr = new InputStreamReader(fis, "UTF8");
BufferedReader br = new BufferedReader(isr);
String line="";
while((line=br.readLine())!=null){
System.out.println(line);
}
// Do i need to add these 3 statements ...
//br.close();
//isr.close();
//fis.close();
//Without the above 3 statements also the code works fine ...
fis = new FileInputStream(filename2);
isr = new InputStreamReader(fis, "UTF8");
br = new BufferedReader(isr);
line="";
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
isr.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
java中的文件读取并不打算关闭打开的流并释放与第一个文件filename1相关的任何系统资源?
没有抛出异常。
答案 0 :(得分:2)
所以你有资源泄漏,除非你,否则不会给你造成任何问题;
答案 1 :(得分:1)
代码有效,但这不是一个好习惯。
当垃圾收集器决定运行并取消分配您的第一个FileInputStream
对象时,Java将自动关闭第一个文件。这可能会在您丢失对象的最后一个引用后的任何时间发生,但根本不会发生,具体情况可能会发生,具体取决于您的内存条件。
如果您使用的是Java 7,则可以使用 try with resources 构造,它将为您调用close
:
try (FileInputStream fis = new FileInputStream(filename1);
InputStreamReader isr = new InputStreamReader(fis, "UTF8");
BufferedReader br = new BufferedReader(isr)) {
// Code...
}
答案 2 :(得分:1)
为StreamReader创建新实例后,自动为之前打开的流调用垃圾回收。