1. Класс Files
Чтобы работать с файлами, есть шикарный утилитный класс — java.nio.file.Files
. У него есть методы просто на все случаи жизни. Все методы этого класса статические и работают с объектами типа Path. Методов очень много, поэтому мы рассмотрим только основные:
Метод | Описание |
---|---|
|
Создает новый файл с путем path |
|
Создает новую директорию |
|
Создает несколько директорий |
|
Создает временный файл |
|
Создает временную директорию |
|
Удаляет файл или директорию, если она пуста |
|
Копирует файл |
|
Перемещает файл |
|
Проверяет, что путь — это директория, а не файл |
|
Проверяет, что путь — это файл, а не директория |
|
Проверяет, что объект по заданному пути существует |
|
Возвращает размер файла |
|
Возвращает все содержимое файла в виде массива байт |
|
Возвращает все содержимое файла в виде строки |
|
Возвращает все содержимое файла в виде списка строк |
|
Записывает в файл массив байт |
|
Записывает в файл строку |
|
Возвращает коллекцию файлов (и поддиректорий) из заданной директории |
2. Создание файлов и директорий
Файлы и директории создавать очень просто. Убедимся на примерах:
Код | Примечание |
---|---|
|
Создает файл |
|
Создает директорию |
|
Создает директорию и все нужные поддиректории, если их не существует. |
3. Копирование, перемещение и удаление
Копировать, перемещать и удалять файлы так же легко. На директории это тоже распространяется, но они должны быть пустые.
Код | Примечание |
---|---|
|
Копирует файл |
|
Перемещает и переименовывает файл |
|
Удаляет файл |
4. Проверка типа файла и факта существования
Когда у вас есть какой-то путь, полученный извне, вы бы хотели знать, это файл или директория. Ну и вообще: существует такой файл/директория или нет?
Для этого тоже есть специальные методы. Так же можно легко узнать длину файла:
Код | Примечание |
---|---|
|
|
|
|
|
|
|
|
5. Работа с содержимым файла
И наконец, есть целая серия методов, которые позволяют легко прочитать или записать содержимое файла. Пример:
Код | Описание |
---|---|
|
Читаем содержимое файла в виде списка строк. Выводим строки на экран |
6. Получение содержимого директории
Остался еще самый интересный метод — получение файлов и поддиректорий в заданной директории.
Для этого есть специальный метод — newDirectoryStream()
, который возвращает специальный объект типа DirectoryStream<Path>
. У него есть итератор(!), и с помощью этого итератора можно получить все файлы и поддиректории заданной директории.
Выглядит проще, чем кажется:
Код | Описание |
---|---|
|
Получаем объект со списком файлов Цикл по списку файлов |
Объект DirectoryStream<Path>
обладает двумя свойствами. Во-первых, у него есть итератор, который возвращает пути к файлам, и мы можем этот объект использовать внутри цикла for-each
.
А во-вторых, этот объект является потоком данных, и его нужно закрывать с помощью метода close()
, ну или использовать внутри try
-with-resources.
7. Метод Files.newInputStream
Начиная с Java 5 классы FileInputStream
и FileOutputStream
стали считаться устаревшими. Одним из их минусов было то, что при создании объекта этих классов сразу происходит создание файлов на диске. И потенциально выбрасываются все ошибки, связанные с созданием файлов.
Впоследствии это было признано не самым хорошим решением. Поэтому для создания объектов-файлов рекомендуется использовать методы утилитного класса – java.nio.Files
.
Вот сравнение старого подхода к созданию файлов и нового:
Было |
---|
|
Стало |
|
Аналогично замена и для FileOutputStream
:
Было |
---|
|
Стало |
|