Чтение файлов на Java с теми же программами чтения файлов
У меня есть два файла для чтения, используя одни и те же переменные для задачи со следующим кодом:
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?
Нет исключений.
3 ответа
Таким образом, у вас есть утечка ресурсов, которая не вызовет проблем для вас, если вы сами;
- попытаться удалить файл в Windows (так как файл все еще открыт)
- делайте это много раз, в этом случае у вас могут не хватить файловых дескрипторов.
Код работает, но это не очень хорошая практика.
Java автоматически закроет первый файл, когда сборщик мусора решит запустить и освободить ваш первый FileInputStream
объект. Это может произойти в любое время после потери последней ссылки на объект, но может даже не произойти вообще, в зависимости от условий вашей памяти.
Если вы используете Java 7, вы можете использовать конструкцию try with resources, которая вызовет close
для тебя:
try (FileInputStream fis = new FileInputStream(filename1);
InputStreamReader isr = new InputStreamReader(fis, "UTF8");
BufferedReader br = new BufferedReader(isr)) {
// Code...
}
Создав новый экземпляр для StreamReader, автоматически вызовите сборщик мусора для ранее открытого потока.