Класс File в Java: работа с файлами и каталогами - Вопросы
Всего: 6 вопросов
1. Что такое класс File в Java и какие у него есть конструкторы?
Что такое класс 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? Что вернут эти методы, если файла нет?
Как узнать, существует ли файл, и получить его размер и дату изменения через 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() отличается от 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 и как эти методы сообщают об ошибке?
Как создать, переименовать и удалить файл с помощью класса 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?
Как получить список файлов каталога через 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 и что выбрать в новом коде?
Чем 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().