Это java.nio.file.Файлы.newInputStream (мой файл.toPath()) лучше, чем new FileInputStream (файл)?

#java

#java

Вопрос:

Я использовал soanr для проверки моего Java-кода, и одна проблема показывает, что мы должны использовать java.nio.file.Файлы.newInputStream(мой файл.toPath()) вместо нового FileInputStream(файл). И описание сонара такое :

Этот метод создает и использует объект java.io.FileInputStream или java.io.FileOutputStream. К сожалению, оба этих класса реализуют метод finalize , что означает, что созданные объекты, скорее всего, будут зависать до тех пор, пока не произойдет полная сборка мусора, что оставит избыточный мусор в куче дольше, и потенциально намного дольше, чем ожидалось. Java 7 представила два способа создания потоков для чтения и записи файлов, которые не имеют этой проблемы. Вам следует рассмотреть возможность переключения с этих вышеупомянутых классов на InputStream is = java.nio.file.Файлы.newInputStream (мой файл.toPath()); OutputStream os = java.nio.file.Files.newOutputStream(мой файл.toPath());

Мой вопрос в том, правильно ли это?

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

1. Я был бы удивлен. В Javadoc нет ничего о том, что он не содержит финализатора.

Ответ №1:

Это плотное утверждение. Таким образом, возможно, стоит разбить его на меньший фрагмент. Перво-наперво,

Этот метод создает и использует объект java.io.FileInputStream или java.io.FileOutputStream. К сожалению, оба этих класса реализуют метод finalize

Это правда и ложь. сама функция была помечена как устаревшая начиная с java 9. И он был удален 5 месяцев назад. Итак, в зависимости от используемой вами версии java. Вероятно, он все еще существует (при условии, что большинство людей все еще используют java 8). Смотрите этот коммит для получения дополнительной информации.

это означает, что созданные объекты, скорее всего, будут зависать до тех пор, пока не произойдет полная сборка мусора, что оставит избыточный мусор в куче дольше и, возможно, намного дольше, чем ожидалось

Да, потому что finalize функция вызывается после GC. Тогда, скорее всего, объект задержался бы в куче дольше. Смотрите finalize функцию javadoc здесь.

Java 7 представила два способа создания потоков для чтения и записи файлов, которые не имеют этой проблемы

Верно, я проверил исходный код в репозитории openjdk. И я не вижу реализации классов, которые используют эти две функции, реализующих finalize метод. Смотрите репо здесь