Управление файлами в Java

Управление файлами в JavaУправление файлами не ограничивается только чтением и записью. Класс File инкапсулирует все функциональные возможности, которые могут потребоваться для работы с файловой системой на машине пользователя.

Например, его можно применять для выяснения времени последнего изменения файла, а также удаления или переименования файла. Другими словами, классы потоков имеют дело с содержимым файла, а класс File — с хранением файла на диске.

Кроме того, как часто бывает в Java, класс File следует принципу «наименьшего знаменателя». Например, в Windows можно узнавать о наличии у файла флага «только для чтения(и даже устанавливать его), а вот хотя узнавать о том, является ли файл скрытым, можно, скрывать его без использования платформо-ориентированного метода нельзя.Самый простейший конструктор объекта File принимает в качестве параметра(полное) имя файла. Если путь к этому файлу не указывается, Java использует текущий каталог. Например, строка кода:

File f = new File(«test.txt»);

приведет к создания объекта файла с именем test.txt в текущем каталоге. Под «текущим каталогам» в данном случает подразумевается текущий каталог того процесса, который выполняет виртуальная машина. Если виртуальная машина была запущена из командной строки, это будет тот каталог, из которого был запущен исполняемый файл java.

Поскольку символ обратной косой черты служит в строках Java символом отмены, при указании путей в стиле Windows следует обязательно не забывать использовать два символа обратной косой черты(«C:\\Windows\\win.ini»), поскольку в большинстве системных вызов, ориентированных на обработку файлов, символы левой косой черты будут интерпретироваться как разделители файлов.

Однако делать это все-таки не рекомендуется, поскольку поведение системных функций Windows подвержено изменениями, а также потому, что в других операционных системах разделитель файлов может выглядеть и подругому. Вместо этого при создании переносимых программ следует использовать символ разделителя файлов той платформы, на которой данная программа выполняется. Увидеть, как он выглядит, можно в строковой константе File.separator.

Вызов этого конструктора не приводит к созданию файла с этим именем, если он не существует. На самом деле создание файла из объекта File осуществляется с помощью либо из одного конструкторов классов потоков, либо метода createNewFile из класса File.

Метод createNewFile создает файл только в том случае, если не существует ни одного файла с таким именем, и возвращает значение boolean, информирующее о том, удалось ли ему успешно завершить свою операцию.

Кстати, не знаете где купить детскую обувь по оптовым ценам? Советуем вам вот такой онлайн магазин http://lilin-shoes.com.ua/ где продается детская обувь по самым доступным ценам на рынке.

С другой стороны, когда имеется объект File, о том, существует файл с таким именем или нет, в классе File сообщает метод exists. Например, следующая демонстрационная программа почти наверняка будет выводить на любом компьютере false, но при этом все равно сможет распечатывать путь к данному не существующему файлу.

Существует еще два других конструктора для объектов File.

Первый выглядит вот так:

и создает объект File с заданным именем в том каталоге, на который указывает параметр path. Если в параметре path содержится значение null, тогда он создает объект File в текущем каталоге.

И, наконец, второй конструктор позволяет использовать существующий объект File:

Здесь объект File представляет каталог. Как и раньше, если в dir содержится значение null, конструктор создает объект File в текущем каталоге.

Немного путающим является то, что объект File может представлять как файл, так и каталог(пожалуй, из-за того, что в операционной системе, с которой более всего были знакомы разработчики Java, каталоги реализуются в виде файорв).

Для указывания того, файл или все таки каталог представляет объект File, применяются методы isDirectory и isFile. Это удивляет, поскольку в обьектно-ориентированной системе следовало бы ожидать наличие отдельного класса Directory, возможно, расширяющего класс File.

Сделать так, чтобы объект представлял каталог, можно просто путем указания в конструкторе File имени требуемого каталога:

Если нужного каталога еще не существует, его можно создать с помощью метода mkdir:

Если объект файла представляет каталог, то для получения массива имен содержащихся в этом каталоге файлов можно воспользоваться методом list(). В программе, код который приведен в конце статьи, все эти методы применяются для отображения подструктуры каталогов любого вводимого в командной строке пути. Эту программу можно довольно легко превратить в служебный класс, возвращающий список подкаталогов для дальнейшей обработки.

Для манипулирования именами файлов и каталогов лучше всегда использовать объекты File, а не строки. Например, методу equals класса File известно, что в некоторых файловых системах регистру не придается значения, и что замыкающий символ / в имени каталога роли не играет.

Вот полный код нашей программы:

 

Вместо того чтобы получать полный список всех файлов в каталоге, можно сужать этот список необходимым образом путем передачи методу list в качестве параметра объекта FilenameFilter. Такие объекты представляют собой просто экземпляры класса, удовлетворяющего требования интерфейса FilenameFilter.

Для реализации интерфейса FilenameFilter классу требуется всего лишь определить метод под названием accept. Ниже приведен пример простого класса FilenameFilter, разрешающего принимать только файлы с указанным расширением:

public class ExtensionFilter implements FilenameFilter
{
public