Чтение файлов на 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, автоматически вызовите сборщик мусора для ранее открытого потока.

Другие вопросы по тегам