проверка конца файла в java путем сравнения с null

#java

#java

Вопрос:

Пример кода взят с официального сайта Java по ссылке:https://docs.oracle.com/javase/tutorial/essential/io/bytestreams.html

В следующих строках кода я не понял

1) почему объекту FileInputStream изначально присвоено значение null? 2) логика условия if в блоке finally

 public Class A{

public static void main(String[] args){

        FileInputStream in = null;
        FileOutputStream out = null;

        try {
            in = new FileInputStream("xanadu.txt");
            out = new FileOutputStream("outagain.txt");
            int c;

            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } 
         finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    } 

}
  

Комментарии:

1. 1. Попробуйте удалить инициализацию с помощью null и скомпилировать код, и вы поймете почему. 2. Если FileInputStream() выдает исключение, каким будет значение in и out в блоке finally? Что произойдет, если он не проверит значение null? Примечание: это не имеет абсолютно никакого отношения к «проверке конца файла».

2. Вы можете написать код, который делает то же самое, используя try (FileOutputStream out = new FileOutputStream("outagain.txt"), FileInputStream in = new FIleInputStream("xanadu.txt")) { ... } catch (IOException e) { ... } инструкцию, для которой не нужен finally блок.

3. Этот пример кода, должно быть, был написан более 10 лет назад, до того, как была доступна инструкция try-with-resources. Теперь вам не следует кодировать это подобным образом и вместо этого следует использовать try-with-resources .

4. что здесь делает оператор while((c =in.read() !=-1)? в блоке while также не используется операция увеличения… не могли бы вы, пожалуйста, помочь мне понять

Ответ №1:

1) FileInputStream и FileOutputStream должны быть инициализированы некоторым значением. Поэтому они инициализируются с помощью null.

Они будут повторно инициализированы в вашем блоке try / catch. Таким образом, считываются два файла. Если этот процесс завершится неудачей, поскольку файлы не существуют, программа выйдет из блока try и выполнит «finally»-блок. В противном случае он выполнит цикл while и после этого выполнит блок finally.

2) Условие в вашем блоке finally сравнивает «in» с «null». Файлы закрываются только тогда, когда out / in не равен null. На первом шаге 1) мы устанавливаем для них значение null. Сравнивая их с null на этом этапе, мы можем увидеть, правильно ли сработало открытие файла.

Если это сработало правильно, in / out на данный момент не будет null, и, следовательно, у нас есть допустимый файл для закрытия. Если оно по-прежнему равно null, файл открылся некорректно и, следовательно, его не обязательно закрывать.

Этот процесс является типичной обработкой ошибок. Мы не хотим, чтобы программа завершила работу из-за невозможности чтения файла.