File, Files, Path

Открыта

— Привет, Амиго. Давно не виделись.

— Привет, Билаабо. О чем будешь рассказывать?

— Сегодня я расскажу о работе с файлами. В Java есть специальный класс (File), с помощью которого можно управлять файлами на диске компьютера. Для того чтобы управлять содержимым файлов, есть другие классы: FileInputStream, FileOutputStream,…

File, Files, Path - 1

— Интересно. А когда ты говоришь «управлять файлами», что ты имеешь в виду?

— Как раз сейчас и расскажу. Файлы можно создавать, удалять, переименовывать и еще много чего. Практически во все классы, которые работают (читают, пишут, изменяют) с содержимым файла, можно передавать объект класса File. Пример:

Можно сразу передавать имя файла в FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
А можно отдельно создать объект-файл, а потом передать его в FileInputStream
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

— Но во втором случае длиннее же получается. Так и не понял – зачем эти файлы нужны.

— Для этого конкретного случая – да. Это не пример, как надо делать, а скорее – как можно.
Но вот представь, что тебе нужно вывести на экран список всех файлов, которые находятся в определенной директории (папке). Вот как это можно сделать с помощью файлов:

Код
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

listFiles() – это метод, который возвращает список файлов в папке с именем «c:/path/»?

— Да. Хотя программисты обычно говорят «директория» или «каталог». Название «папка» стало употребляться совсем недавно, но, в принципе, они все верные, и ты можешь говорить, как тебе удобнее.

— Ок. А getName() что делает? Выдает имя файла? И какое именно имя? Полное вместе с путем или только имя самого файла?

— Только имя самого файла. Для полного есть file.getAbsolutePath()

— А какие еще методы есть у класса File?

— Вот, смотри:

Метод Описание
boolean isDirectory() Является ли «объект файла» директорией
boolean isFile() Является ли объект файлом
long length() Возвращает размер/длину файла в байтах.
boolean createNewFile() Создает файл. Если такой файл уже был, возвращает false.
boolean mkdir() Создает директорию. Название mkdir происходит от «make directory».
boolean mkdirs() Создает директорию и все поддиректории.
boolean delete() Удаляет файл объекта на диске. Если объект – директория, то только, если в ней нет файлов.
void deleteOnExit() Добавляет файл в специальный список файлов, которые будут автоматически удалены при закрытии программы.
File createTempFile(
String prefix,
String suffix,
File directory)
Создает «временный файл» — файл с случайно сгенерированным уникальным именем – что-типа «dasd4d53sd».
Дополнительные параметры – префикс к имени, суффикс (окончание). Если директория не указана, то файл создается в специальной директории ОС для временных файлов
boolean exists() Возвращает true, если файл с таким именем существует на диске компьютера.
String getAbsolutePath() Возвращает полный путь файла со всеми поддиректориями.
String getCanonicalPath() Возвращает канонический путь файла.
Например, преобразовывает путь «c:/dir/dir2/../a.txt» к пути «c:/dir/a.txt»
String[] list() Возвращает массив имен файлов, которые содержатся в директории, которой является текущий объект-файл.
File[] listFiles() Возвращает массив файлов, которые содержатся в директории, которой является текущий объект-файл.
long getTotalSpace() Возвращает размер диска (количество байт) на котором расположен файл.
long getFreeSpace() Возвращает количество свободного места (количество байт) на диске, на котором расположен файл.
boolean renameTo(File) Переименовывает файл – содержимое файла фактически получает новое имя. Т.е. можно переименовать файл «c:/dir/a.txt» в «d:/out/text/b.doc».
String getName() Возвращает только имя файла, без пути.
String getParent() Возвращает только путь (директорию) к текущему файлу, без самого имени.
Path toPath() Возвращает объект Path, который соответствует текущему объекту File.

— Ничего себе! А немаленький такой список получился. Да и вроде, можно довольно много сделать с помощью него: создавать, удалять файлы, переименовывать,…

А чтобы получить директорию текущего файла, надо вызвать getParent()?

— Ага, но он вернет не объект-файл, а строку – путь к файлу. Фактически у класса File почти все методы дублированы: одна версия возвращает String, вторая File. Вот смотри:

File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();

Если у тебя есть строка с путем к файлу, а надо объект File, то воспользуйся конструктором. Если же наоборот – есть объект File, а нужна строка – используй getAbsolutePath(). Пример:

String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();

— Понял.

— Отлично. Тогда вот тебе маленькое задание – выведи имена всех файлов, которые есть в той же директории, что и текущий файл.

— Нет ничего проще, вот, смотри:

Код
//какой-то текущий файл
File originalFile = new File("c:/path/dir2/a.txt");

//объект-директория
File folder = originalFile.getParentFile();

//печать списка файлов на экран
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

— Гм. Правильно.

— А то! Немного путает, что и для файла и для директории используется один и тот же класс – File. Как то это не очень логично, мне кажется.

— Так исторически сложилось. Раньше директория была специальным «пустым» файлом на диске. Сейчас уже, конечно, многое изменилось, но не везде. У меня на сегодня все.

— Спасибо, за отличную лекцию, Билаабо.

Комментарии (115)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Максим Li Backend Developer
29 ноября 2025, 10:50
Red Lord
Уровень 0
15 октября 2025, 14:38
По поводу последнего вопроса. В UNIX и сейчас каталог является файлом (как и мягкие и жесткие символьные ссылки и различные устройства в /dev). В файловых системах DOS и Windows (FAT12, FAT16, FAT32, NTFS) также каталоги являются файлами со специальным атрибутом. Например, в WinAPI для поиска каталогов используется функция FindFirstFile, и далее в результатах поиска надо проверять флаг FILE_ATTRIBUTE_DIRECTORY. Было бы очень странно не делать каталоги файлами, это бы только усложнило ОС на ровном месте, т.к. пришлось бы тогда заводить отдельные команды для их копирования, переименования и т.д.
{Java_Shark}
Уровень 36
10 января 2025, 14:58
++
27 марта 2025, 03:26
++Java_Shark
Kekosina
Уровень 30
3 декабря 2024, 17:14
Всем привет кто с 16 лвл Кто хочет почитать эту лекцию открывайте эту страницу в другом браузере или выйдите с аккаунта Она свободно доступна незарегистрированным пользователям
Ринат
Уровень 22
27 ноября 2024, 00:53
Я пришел с ада 16 уровня, дайте почитать (((
qaseqiara я обязательно выживу
23 мая 2024, 19:30
тем кто с задачи "Перепутанные байты" желаю побольше терпения. Ситуация патовая
Alexander KarpeevCEO в Apple
13 декабря 2023, 22:48
Вот эта тема бы не помешала бы на 16 уровне syntax pro
Ика
Уровень 36
2 января 2024, 17:33
самое смешное что я сейчас на 16 уровне и меня к этой статье гугл привел и я не могу ее почитать
Svetlana S.
Уровень 41
30 января 2024, 06:43
да на 16 уровне просто через гугл выдал ссылку а открыть никак :( вот эта доступна https://javarush.com/groups/posts/2275-files-path сижу разбираюсь
Серджио
Уровень 28
23 сентября 2023, 13:37
Завершив первые два модуля, поставлю курс на паузу, пора уже качать практику!
Dr.Alexcemen9Врач в Поликлиника в деревн
27 декабря 2024, 03:14
Скачал?
Серджио
Уровень 28
4 января 2025, 20:11
Ушёл на самообучение, не устраивает теория новых модулей.
27 марта 2025, 03:28
уж за полтора года работать пора б уже начать
Andrei Paşa
Уровень 27
1 сентября 2023, 14:39
Тогда вот тебе маленькое задание – выведи имена всех файлов, которые есть в той же директории, что и текущий файл. В ответе предлагается избыточное по ресурсам решение: сначала получаются объекты класса File, а потом у них у каждого вызывается метод getName(). Для получения списка имён есть же готовый метод list():
for(String s : originalFile.list()) {
            System.out.println(s);
        }
Sergey Paleny
Уровень 27
25 сентября 2023, 08:20
Здравствуй. Твоё решение выдаёт перечень файлов конкретной папки. А требуется выдать все папки/файлы, которые находятся рядом с этой конкретной папкой.
Andrei Paşa
Уровень 27
25 сентября 2023, 08:36
Привет. К сожалению, ты ошибаешься: метод list выводит весь контент директории, в т.ч. и папки. Документация Oracle Вот простой пример, чтобы было нагляднее:
public class FileX {
    public static void main(String args[])
    {
        try {
            File f = new File("c:/");
            String[] files = f.list();

            System.out.println("Files are:");
            Arrays.stream(files).forEach(System.out::println);
        }
        catch (Exception e) {
            System.err.println(e.getMessage());
        }
    }
}
Kurama
Уровень 50
7 декабря 2022, 15:36
Я воспринимаю класс File как устаревший, поэтому скипаю его
AlinaPython Developer в Mynavi Corporation
14 июня 2023, 07:57
Проблема в том, что эта устаревашя модель может встречаться в рабочем проекте, которым уже лет 5-10. В таком случае нужно понимание, зачем и как этим пользоваться)