Создать каталог в Java
В этом посте будет обсуждаться, как создать каталог в Java, включая все несуществующие родительские каталоги.
1. Использование File#mkdirs() метод
Стандартным решением для создания каталога является использование mkdir() метод из File учебный класс. Возвращает true, если каталог создан; ложно в противном случае. Вызов этого метода будет выглядеть следующим образом:
Обратите внимание, что mkdir() метод полезен для создания одного каталога. Если вы хотите создать иерархию папок, вы должны использовать mkdirs() метод вместо этого. Он создает каталог, названный абстрактным путем, включая любые несуществующие родительские каталоги.
Например, следующий код создает родительский каталог с именем path (если не существует), за которым следует его подкаталог dir .
Файлы и директории, класс File
Класс File пакета java.io используется для управления информацией о файлах и каталогах. На уровне операционной системы файлы и каталоги имеют существенные отличия, но в Java они описываются одним классом File. Каталог в Java трактуется как обычный файл, но с дополнительным свойством — списком имен файлов, который можно просмотреть с помощью метода list.
В зависимости от назначения объект File — файл или каталог, можно использовать один из конструкторов для создания объекта:
Примеры создания объектов File
Свойства и методы класса File
Для определения стандартных свойств файла в классе File имеются различные методы. Однако класс File несимметричен, т.е. методы определения свойств объекта существуют, но соответствующие функции для изменения этих свойств отсутствуют.
| Функции | Описание |
|---|---|
| String getName() | Наименование файла или каталога. |
| String getParent() | Наименование родительского каталога. |
| long length() | Функция определения размера файла в байтах. |
| String getAbsolutePath() | Функция определения абсолютного пути файла или каталога. |
| boolean delete() | Удаления файла или каталога. |
| boolean exists() | Проверка существования файла или каталога. |
| boolean isDirectory() | Проверка, является ли данный объект каталогом. |
| boolean isFile() | Проверка, является ли данный объект файлом. |
| long lastModified() | Функция определения даты последней модификации файла. |
| boolean canRead() | Проверка, можно ли читать данные из файла. |
| boolean canWrite() | Проверка, можно ли записывать данные в файл. |
| boolean isHidden() | Проверка, являются ли каталог или файл скрытыми. |
| String[] list() | Чтение массива наименований файлов и подкаталогов. |
| File[] listFiles() | Чтение массива файлов и подкаталогов. |
| boolean mkdir() | Создание нового каталога. |
| boolean renameTo(File dest) | Переименовывание файла или каталога. |
В следующем примере открываем файл "d:/test/MyFile.txt" (Windows) и извлекаем его характеристики:
В консоли будет отпечатана следующая информация:
Интерфейс FileFilter
Класс File включает метод, позволяющий прочитать список только определенных файлов.
В отличие от одноименного метода, но без параметра, данный метод отбирает только те файлы каталога, которые удовлетворяют определенному условию. Параметр filter предназначен для задания этого условия. При этом тип параметра FileFilter — это не класс, а интерфейс, который имеет всего один метод, возвращающий true, если файл удовлетворяет определенным условиям, и false в противном случае.
Метод listFiles будет вызывать метод accept для каждого файла в каталоге, и те, для которых accept вернет true, будут включены в результирующий список. Остальные будут проигнорированы.
Для использования FileFilter необходимо создать объект и определить в нем соответствующий метод accept.
Пример использования фильтра FileFilter
Чтение содержимого файла FileInputStream
Для чтения содержимого файла можно использовать класс FileInputStream, который является наследником класса InputStream и реализует все его методы. Конструктор класса FileInputStream :
Если файл не может быть открыт то генерируется исключение FileNotFoundException.
Пример считывания данных из файла и вывод содержимого в консоль:
Данные файла можно считать в массив байтов :
Класс FileInputStream предназначен прежде всего для работы с двоичными файлами. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.
Пример использования FileInputStream для чтения файла свойств в кодировке UTF-8:
Файл свойств "data.properties" в кодировке UTF-8:
Запись в файл FileOutputStream
Класс FileOutputStream, является производным от класса OutputStream, поэтому наследует всю его функциональность.
Пример записи строки в файл:
Для создания объекта FileOutputStream используется конструктор, принимающий в качестве параметра путь к файлу для записи. Для записи строки ее сначала переводим в массив байт и с помощью метода write строка записывается в файл. Необязательно записывать весь массив байтов. Используя перегрузку метода write(), можно записать и одиночный байт:
Пример перезаписи содержимого из одного файла в другой:
Класс FileOutputStream предназначен прежде всего для записи двоичных файлов. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.
19.1. Java — Потоки ввода/вывода и работа с файлами и каталогами
Пакет java.io содержит почти каждый класс, который может потребоваться Вам для совершения ввода и вывода в Java. Все данные потоки представлены потоком ввода и адресом вывода. Поток в пакете java.io осуществляет поддержку различных данных, таких как примитивы, объекты, локализованные символы и т.д.
Содержание
Потоки
Потоки в Java определяются в качестве последовательности данных. Существует два типа потоков:
- InPutStream – поток ввода используется для считывания данных с источника.
- OutPutStream – поток вывода используется для записи данных по месту назначения.
Java предоставляет сильную, но гибкую поддержку в отношении ввода/вывода, связанных с файлами и сетями, однако в данном руководстве рассмотрены лишь базовые функции, связанные с потоками и вводом/выводом. Рассмотрим далее по порядку наиболее распространенные примеры.
Байтовый поток
Потоки байтов в Java используются для осуществления ввода и вывода 8-битных байтов. Не смотря на множество классов, связанных с потоками байтов, наиболее распространено использование следующих классов: FileInputStream и FileOutputStream. Ниже рассмотрен пример, иллюстрирующий использование данных двух классов для копирования из одного файла в другой.
Примечание по примеру: чтобы скопировать файл, необходимо в папке проекта создать файл file.txt с любым или пустым содержимым.
Пример
Теперь рассмотрим файл file.txt со следующим содержимым:
В качестве следующего шага необходимо скомпилировать java-программу и выполнить ее, что позволит создать файл copied_file.txt с тем же содержимым, что имеется в file.txt. Таким образом, разместим обозначенный код в файле FileCopy.java и выполним следующее действие:
Символьные потоки
Потоки байтов в Java позволяют произвести ввод и вывод 8-битных байтов, в то время как потоки символов используются для ввода и вывода 16-битного юникода. Не смотря на множество классов, связанных с потоками символов, наиболее распространено использование следующих классов: FileReader и FileWriter. Не смотря на тот факт, что внутренний FileReader использует FileInputStream, и FileWriter использует FileOutputStream, основное различие состоит в том, что FileReader производит считывание двух байтов в конкретный момент времени, в то время как FileWriter производит запись двух байтов за то же время.
Мы можем переформулировать представленный выше пример, в котором два данных класса используются для копирования файла ввода (с символами юникода) в файл вывода.
Примечание по примеру: чтобы скопировать файл, необходимо в папке проекта создать файл file.txt с любым или пустым содержимым.
Пример
Теперь рассмотрим файл file.txt со следующим содержимым:
В качестве следующего шага необходимо скомпилировать программу и выполнить ее, что позволит создать файл copied_file.txt с тем же содержимым, что имеется в file.txt. Таким образом, разместим обозначенный код в файле FileCopy.java и выполним следующее действие:
Стандартные потоки
Все языки программирования обеспечивают поддержку стандартного ввода/вывода, где программа пользователя может произвести ввод посредством клавиатуры и осуществить вывод на экран компьютера. Если вы знакомы с языками программирования C либо C++, вам должны быть известны три стандартных устройства STDIN, STDOUT и STDERR. Аналогичным образом, Java предоставляет следующие три стандартных потока:
- Стандартный ввод – используется для перевода данных в программу пользователя, клавиатура обычно используется в качестве стандартного потока ввода, представленного в виде System.in.
- Стандартный вывод – производится для вывода данных, полученных в программе пользователя, и обычно экран компьютера используется в качестве стандартного потока вывода, представленного в виде System.out.
- Стандартная ошибка – используется для вывода данных об ошибке, полученной в программе пользователя, чаще всего экран компьютера служит в качестве стандартного потока сообщений об ошибках, представленного в виде System.err.
Ниже представлена простая программа, которая создает InputStreamReader для чтения стандартного потока ввода, до введения пользователем «q»:
Пример
Разместим представленный выше код в файле ReadConsole.java и попробуем скомпилировать и выполнить его согласно тому, как это представлено в следующей программе. Данная программа продолжает чтение и вывод одного и того же символа до нажатия ‘q’:
Чтение и запись файла
Как было указано выше, поток представляет собой последовательность данных. InputStream используется для считывания данных с источника, OutputStream служит для записи данных по месту назначения.
Ниже представлена иерархия классов для управления потоками Ввода и Вывода.

В данном уроке нам предстоит рассмотреть два важных потока: FileInputStream и FileOutputStream.
Поток FileInputStream – чтение из файла
Поток FileInputStream – это поток, который используется в Java для чтения данных из файла. Объекты могут быть созданы при использовании ключевого слова new, доступны несколько типов конструкторов.
Представленный конструктор использует имя файла в качестве потока с целью создания объекта входного потока для считывания файла:
Представленный ниже конструктор использует объектный файл с целью создания объекта входного потока для чтения файла. Сперва мы создаем объектный файл при использовании метода File() следующим образом:
Теперь, получив объект InputStream, следует ознакомиться со следующим перечнем вспомогательных методов, которые могут быть использованы для считывания потока либо выполнения иных операций в потоке.
| № | Метод и описание |
| 1 | public void close() throws IOException<> Данный метод в Java закрывает выходной файловый поток. Освобождает какие-либо системные ресурсы, связанные с файлом. Выдает IOException. |
| 2 | protected void finalize()throws IOException <> Данный метод выполняет очистку соединения с файлом. Позволяет удостовериться в вызове закрытого метода данного выходного файлового потока при отсутствии каких-либо ссылок на данный поток. Выдает IOException. |
| 3 | public int read(int r)throws IOException<> Данный метод осуществляет в Java считывание заданных байтов данных из InputStream. Возврат данных типа int. Возврат следующего байта данных, в конце файла будет произведен возврат к -1. |
| 4 | public int read(byte[] r) throws IOException<> Данный метод производит считывание байтов r.length из входного потока в массив. Возврат общего числа считанных байтов. В конце файла будет произведен возврат к -1. |
| 5 | public int available() throws IOException<> Выдает число байтов, которые могут быть считаны из входного файлового потока. Возврат данных типа int. |
Существуют также другие доступные входные потоки, более детальные сведения о которых представлены по следующим ссылкам:
Поток FileOutputStream – создание и запись файла
Поток FileOutputStream – это поток, который используется в Java для создания файла и последующей записи в него. Поток создаст файл в случае его отсутствия перед его открытием для вывода.
Далее представлены два конструктора, которые могут быть задействованы при создании объекта FileOutputStream.
Представленный конструктор использует имя файла в качестве строки с целью создания объекта входного потока для записи файла в Java:
Представленный ниже конструктор использует объектный файл с целью создания объекта выходного потока для записи файла. Сперва мы создаем объектный файл при использовании метода File() следующим образом:
Теперь, получив объект OutputStream, следует ознакомиться со следующим перечнем вспомогательных методов, которые могут быть использованы для записи потока либо выполнения иных операций в потоке.
| № | Метод и описание |
| 1 | public void close() throws IOException<> Данный метод в Java закрывает выходной файловый поток. Освобождает какие-либо системные ресурсы, связанные с файлом. Выдает IOException. |
| 2 | protected void finalize()throws IOException <> Данный метод выполняет очистку соединения с файлом. Позволяет удостовериться в вызове закрытого метода данного выходного файлового потока при отсутствии каких-либо ссылок на данный поток. Выдает IOException. |
| 3 | public void write(int w)throws IOException<> Данный метод осуществляет запись заданного байта в выходной поток. |
| 4 | public void write(byte[] w) Запись байтов w.length из указанного массива байтов в OutputStream. |
Существуют также другие доступные выходные потоки, более детальные сведения о которых представлены по следующим ссылкам:
Пример
В следующем примере представлены InputStream и OutputStream – потоки для чтения, создания и записи файла:
Представленный выше java-код создаст файл file.txt и пропишет заданные символы в формате char. То же самое будет выводиться на экран стандартного вывода.
Навигация по файловой системе и вводу/выводу
Существует ряд других классов, которые нам предстоит рассмотреть с целью ознакомления с основами навигации в файловой системе и вводу/выводу.
Каталоги в Java
В Java каталог представлен Файлом, который может содержать список других файлов и каталогов. Используя объект File, вы можете создать каталог, прокрутить список файлов, представленных в каталоге. Для получения более детальных сведений, ознакомьтесь с перечнем всех методов, которые могут быть вызваны из объекта File, будучи связанными с каталогами.
Создание каталогов
Существуют два служебных метода File, которые могут быть использованы для создания каталогов:
- Метод mkdir() позволяет создать папку в Java, возвращая значение true при успехе операции, и false в случае сбоя. Сбой свидетельствует о том, что путь указанный в объекте File уже существует, либо что каталог не может быть создан в связи с тем, что полный путь еще не существует.
- Метод mkdirs() создает каталог и все вышестоящие каталоги.
В следующем примере представлено создание папки «/java/proglang/newdir»:
Пример
Скомпилируйте и выполните следующий код для создания каталога «/java/proglang/newdir».
Примечание ? Java автоматически формирует разделители пути в UNIX и Windows с учетом соглашений. При использовании косой черты (/) при работе с Java в системе Windows, производится корректное разрешение пути.
Список файлов в папке
Метод list(), представленный объектом File, может быть использован для предоставления перечня всех файлов и каталогов, имеющихся в заданной папке, в следующем виде:
Пример
Вследствие этого будет получен следующий результат, основанный на каталогах и файлах, доступных в вашем каталоге /NetBeans 8.2/Projects/ReadDirectory/ReadDirectory/: