Перейти к основному содержимому

Класс File. Работа с файлами и каталогами

Класс File, определённый в пакете java.io, не работает напрямую с потоками. Его задачей является управление информацией о файлах и каталогах. Хотя на уровне операционной системы файлы и каталоги отличаются, но в Java они описываются одним классом File.

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

File(String путь)
File(String путь_к_каталогу, String имя_файла)
File(File каталог, String имя_файла)

Например:

// создаём объект File для каталога
File dir1 = new File("C:/SomeDir");
// создаём объекты для файлов, которые находятся в каталоге
File file1 = new File("C:/SomeDir", "Hello.txt");
File file2 = new File(dir1, "Hello2.txt");

Класс File имеет ряд методов, которые позволяют управлять файлами и каталогами. Рассмотрим некоторые из них:

  • boolean canRead(): возвращает true, если файл или каталог существует и доступен текущей программе для чтения, иначе возвращает false.
  • boolean canWrite(): возвращает true, если файл или каталог существует и доступен текущей программе для записи, иначе возвращает false.
  • boolean createNewFile(): создаёт новый файл по пути, который передан в конструктор. Возвращает true, если файл был создан, и false, если он уже существовал. При ошибке ввода-вывода может выбросить исключение IOException.
  • boolean delete(): удаляет каталог или файл по пути, который передан в конструктор. Возвращает true только при успешном удалении. Каталог должен быть пустым.
  • boolean exists(): проверяет, существует ли по указанному в конструкторе пути файл или каталог. И если файл или каталог существует, то возвращает true, иначе возвращает false.
  • String getAbsolutePath(): возвращает абсолютный путь для пути, переданного в конструктор объекта.
  • String getName(): возвращает краткое имя файла или каталога.
  • String getParent(): возвращает строку с путём к родительскому каталогу или null, если родительский путь не определён.
  • boolean isDirectory(): возвращает значение true, если по указанному пути располагается каталог.
  • boolean isFile(): возвращает значение true, если по указанному пути находится файл.
  • boolean isHidden(): возвращает значение true, если каталог или файл являются скрытыми.
  • long length(): возвращает размер файла в байтах.
  • long lastModified(): возвращает время последнего изменения файла или каталога. Значение представляет количество миллисекунд, прошедших с начала эпохи Unix.
  • String[] list(): возвращает массив имён файлов и подкаталогов, непосредственно находящихся в определённом каталоге. Возвращает null, если объект не обозначает каталог или произошла ошибка ввода-вывода.
  • File[] listFiles(): возвращает массив объектов File для файлов и подкаталогов, непосредственно находящихся в определённом каталоге. Возвращает null, если объект не обозначает каталог или произошла ошибка ввода-вывода.
  • boolean mkdir(): создаёт один новый каталог. Родительский каталог должен существовать. Возвращает true при успешном создании и false, если создать каталог не удалось или он уже существует.
  • boolean renameTo(File dest): переименовывает файл или каталог. Возвращает true при успешном переименовании и false при неудаче.

Работа с каталогами​

Если объект File представляет каталог, то его метод isDirectory() возвращает true. И поэтому мы можем получить его содержимое - непосредственно находящиеся в нём подкаталоги и файлы с помощью методов list() и listFiles(). Получим все подкаталоги и файлы в определённом каталоге:

import java.io.File;

public class Program {
public static void main(String[] args) {
// определяем объект для каталога
File dir = new File("C:/SomeDir");
// если объект представляет каталог
if (dir.isDirectory()) {
// получаем все объекты, непосредственно находящиеся в каталоге
for (File item : dir.listFiles()) {
if (item.isDirectory()) {
System.out.println(item.getName() + "\t folder");
} else {
System.out.println(item.getName() + "\t file");
}
}
}
}
}

Теперь выполним ещё ряд операций с каталогами, как удаление, переименование и создание:

import java.io.File;

public class Program {
public static void main(String[] args) {
// определяем объект для каталога
File dir = new File("C:/SomeDir/NewDir");
boolean created = dir.mkdir();
if (created) {
System.out.println("Folder has been created");
}
// переименуем каталог
File newDir = new File("C:/SomeDir/NewDirRenamed");
dir.renameTo(newDir);
// удалим каталог
boolean deleted = newDir.delete();
if (deleted) {
System.out.println("Folder has been deleted");
}
}
}

Работа с файлами​

Работа с файлами аналогична работе с каталогами. Например, получим данные по одному из файлов и создадим ещё один файл:

import java.io.File;
import java.io.IOException;

public class Program {
public static void main(String[] args) {
// определяем объект для файла
File myFile = new File("C:/SomeDir/notes.txt");
System.out.println("File name: " + myFile.getName());
System.out.println("Parent folder: " + myFile.getParent());

if (myFile.exists()) {
System.out.println("File exists");
} else {
System.out.println("File not found");
}

System.out.println("File size: " + myFile.length());
if (myFile.canRead()) {
System.out.println("File can be read");
} else {
System.out.println("File can not be read");
}

if (myFile.canWrite()) {
System.out.println("File can be written");
} else {
System.out.println("File can not be written");
}

// создадим новый файл
File newFile = new File("C:/SomeDir/MyFile");
try {
boolean created = newFile.createNewFile();
if (created) {
System.out.println("File has been created");
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}

При создании нового файла метод createNewFile() может выбросить исключение IOException при ошибке ввода-вывода, поэтому нам надо его отлавливать, например, в блоке try...catch, как делается в примере выше. Если файл уже существует, метод возвращает false.