Какие классы Java позволяют взаимодействовать с файлами на файловой системе
Что проверяют
Знаете ли вы разницу между старым API java.io и java.nio.file, который стоит использовать в новом коде. Следом обычно просят показать чтение файла с правильным закрытием ресурса и явной кодировкой.
Как отвечать
Разделите классы на группы:
java.io.File: старое представление пути. Методы вродеdelete()иmkdir()возвращаютbooleanи не объясняют причину ошибки, поэтому в новом коде его заменяетPath;PathиFiles: современный API.Path.of("data.txt")появился в Java 11 (раньшеPaths.get), аFilesдаётreadString,writeString,readAllLines,copy,move,delete,createDirectories, работу с атрибутами. Ошибки приходят исключениями вродеNoSuchFileException;- байтовые потоки:
FileInputStream,FileOutputStreamилиFiles.newInputStreamдля бинарных данных; - символьные потоки:
BufferedReader,BufferedWriter; черезFiles.newBufferedReader(path, StandardCharsets.UTF_8)кодировка задаётся явно; - обход и большие файлы:
Files.linesиFiles.walkвозвращают ленивыйStream,FileChannelи отображение в память подходят для больших объёмов,RandomAccessFileдля произвольного доступа; - наблюдение:
WatchServiceсообщает о создании, изменении и удалении файлов в каталоге.
Всё, что открывает файл, закрывайте через try-with-resources. Скажите про кодировку: с Java 18 по умолчанию UTF-8 (JEP 400), а до этого она зависела от ОС, и new FileReader(file) вёл себя по-разному на Windows и Linux. Для маленького файла хватит Files.readString(path), большой читайте построчно.
Где спотыкаются
Забывают закрыть Stream из Files.lines или Files.walk. Он держит открытый дескриптор, и без try-with-resources сервис однажды упрётся в лимит открытых файлов.
Вызывают readAllLines на файле в несколько гигабайт и получают OutOfMemoryError.
Проверяют exists() перед созданием или удалением. Между проверкой и действием файл может измениться, надёжнее сразу выполнить операцию и обработать FileAlreadyExistsException или NoSuchFileException.