Класс File в Java: работа с файлами и каталогами - Вопросы

Всего: 6 вопросов

1. 

Что такое класс File в Java и какие у него есть конструкторы?

java.io.File — это представление пути к файлу или каталогу, а не сам файл. Он не читает и не записывает содержимое: с его помощью проверяют существование, размер, права доступа, создают, переименовывают и удаляют файлы и каталоги, получают список файлов каталога.

Конструкторов четыре:

  • File(String pathname) — полный путь: new File("src/io/file.txt");
  • File(String parent, String child) — путь родительского каталога и имя: new File("src/io", "file.txt");
  • File(File parent, String child) — объект File каталога и имя: new File(dir, "file.txt");
  • File(URI uri) — URI со схемой file:.

Ни один конструктор не обращается к диску и не создаёт файл: new File("report.txt") для несуществующего файла отработает без исключения, а exists() вернёт false. Относительный путь отсчитывается от рабочего каталога JVM (System.getProperty("user.dir")), а не от папки с классом.

2. 

Как узнать, существует ли файл, и получить его размер и дату изменения через File? Что вернут эти методы, если файла нет?

  • exists() — true, если файл или каталог существует;
  • isFile() — true для обычного файла, isDirectory() — для каталога; для несуществующего пути оба возвращают false;
  • length() — размер файла в байтах (long); для несуществующего файла — 0, для каталога значение не определено (обычно 0 в Windows, 4096 в Linux);
  • lastModified() — время последнего изменения в миллисекундах с 1 января 1970 года (UTC); если файла нет — 0.
File file = new File("missing.txt");
System.out.println(file.exists());                            // false
System.out.println(file.length());                            // 0
System.out.println(Instant.ofEpochMilli(file.lastModified())); // 1970-01-01T00:00:00Z

Ни один из этих методов не бросает исключение, поэтому length() == 0 ещё не значит, что файл пустой: сначала проверяйте exists(). Времени создания файла класс File не возвращает.

3. 

Чем метод mkdir() отличается от mkdirs() в классе File?

mkdir() создаёт только один, последний каталог пути и возвращает false, если родительского каталога нет. mkdirs() создаёт сам каталог и все недостающие родительские.

File dir = new File("out/reports/2026");
System.out.println(dir.mkdir());   // false - каталога out/reports нет
System.out.println(dir.mkdirs());  // true  - созданы out, out/reports и out/reports/2026
System.out.println(dir.mkdirs());  // false - каталог уже существует

Оба метода возвращают false и тогда, когда каталог уже есть, поэтому проверять «каталог существует» надёжнее через dir.isDirectory(), а не по результату mkdirs().

4. 

Как создать, переименовать и удалить файл с помощью класса File и как эти методы сообщают об ошибке?

  • createNewFile() создаёт пустой файл и возвращает true; если файл уже есть — false, файл не перезаписывается. Это единственный из трёх методов, который объявляет проверяемое IOException (например, если нет родительского каталога).
  • renameTo(File dest) переименовывает или перемещает файл и возвращает boolean; при неудаче — false без объяснения причины.
  • delete() удаляет файл или пустой каталог; для непустого каталога возвращает false.
File file = new File("temp.txt");
File renamed = new File("temp-old.txt");
file.createNewFile();                    // true
file.renameTo(renamed);                  // true
System.out.println(file.exists());       // false
System.out.println(renamed.exists());    // true

Объект File неизменяем: после renameTo() он по-прежнему указывает на старый путь, поэтому дальше работают с объектом из параметра. Результат renameTo() и delete() нужно проверять — иначе неудачная операция пройдёт незамеченной.

5. 

Как получить список файлов каталога через File и почему результат listFiles() нужно проверять на null?

list() возвращает массив имён (String[]), listFiles() — массив объектов File[], у которых сразу можно вызвать isDirectory() или length(). Если путь не является каталогом, каталога нет или к нему нет доступа, оба метода возвращают null, а не пустой массив, и цикл for по такому результату падает с NullPointerException.

File[] files = new File("src").listFiles();
if (files == null) {
    System.out.println("src не является каталогом или недоступен");
    return;
}
for (File f : files) {
    System.out.println(f.getName() + (f.isDirectory() ? " - каталог" : " - файл"));
}

Порядок элементов не гарантирован (при необходимости сортируйте Arrays.sort(files)). Чтобы отобрать нужные файлы, передайте фильтр: listFiles(f -> f.isFile() && f.getName().endsWith(".java")).

6. 

Чем File отличается от Path и Files и что выбрать в новом коде?

Path (путь) и Files (операции) из пакета java.nio.file появились в Java 7 и решают те же задачи, что и java.io.File, но при ошибке бросают исключение с причиной вместо false:

  • file.delete() → false; Files.delete(path) → NoSuchFileException или DirectoryNotEmptyException;
  • file.createNewFile() → false, если файл есть; Files.createFile(path) → FileAlreadyExistsException;
  • renameTo() → false; Files.move() → исключение с причиной;
  • копирования и чтения текста в File нет, в Files есть Files.copy() и Files.readString() (Java 11).

В новом коде обычно выбирают Path и Files; File не устарел (не @Deprecated) и остаётся в старом коде и в API, которые принимают именно File. Переход между API — один вызов: file.toPath() и path.toFile().

Страница 1 из 1