JavaRush /Курсы /Java Collections /File, Files, Path

File, Files, Path

Java Collections
1 уровень , 1 лекция
Открыта

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

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

— Сегодня я расскажу о работе с файлами. В 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. Как то это не очень логично, мне кажется.

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

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

Комментарии (114)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Red Lord Уровень 0
15 октября 2025
По поводу последнего вопроса. В UNIX и сейчас каталог является файлом (как и мягкие и жесткие символьные ссылки и различные устройства в /dev). В файловых системах DOS и Windows (FAT12, FAT16, FAT32, NTFS) также каталоги являются файлами со специальным атрибутом. Например, в WinAPI для поиска каталогов используется функция FindFirstFile, и далее в результатах поиска надо проверять флаг FILE_ATTRIBUTE_DIRECTORY. Было бы очень странно не делать каталоги файлами, это бы только усложнило ОС на ровном месте, т.к. пришлось бы тогда заводить отдельные команды для их копирования, переименования и т.д.
{Java_Shark} Уровень 36
10 января 2025
++
Денис Кокшаров Уровень 32
27 марта 2025
++Java_Shark
Kekosina Уровень 21
3 декабря 2024
Всем привет кто с 16 лвл Кто хочет почитать эту лекцию открывайте эту страницу в другом браузере или выйдите с аккаунта Она свободно доступна незарегистрированным пользователям
Ринат Уровень 22
27 ноября 2024
Я пришел с ада 16 уровня, дайте почитать (((
qaseqiara Уровень 25
23 мая 2024
тем кто с задачи "Перепутанные байты" желаю побольше терпения. Ситуация патовая
Alexander Karpeev Уровень 51
13 декабря 2023
Вот эта тема бы не помешала бы на 16 уровне syntax pro
Ика Уровень 36
2 января 2024
самое смешное что я сейчас на 16 уровне и меня к этой статье гугл привел и я не могу ее почитать
Svetlana S. Уровень 41
30 января 2024
да на 16 уровне просто через гугл выдал ссылку а открыть никак :( вот эта доступна https://javarush.com/groups/posts/2275-files-path сижу разбираюсь
Серджио Уровень 28
23 сентября 2023
Завершив первые два модуля, поставлю курс на паузу, пора уже качать практику!
Dr.Alexcemen9 Уровень 51
27 декабря 2024
Скачал?
Серджио Уровень 28
4 января 2025
Ушёл на самообучение, не устраивает теория новых модулей.
Денис Кокшаров Уровень 32
27 марта 2025
уж за полтора года работать пора б уже начать
Andrei Paşa Уровень 27
1 сентября 2023
Тогда вот тебе маленькое задание – выведи имена всех файлов, которые есть в той же директории, что и текущий файл. В ответе предлагается избыточное по ресурсам решение: сначала получаются объекты класса File, а потом у них у каждого вызывается метод getName(). Для получения списка имён есть же готовый метод list():

for(String s : originalFile.list()) {
            System.out.println(s);
        } 
Sergey Paleny Уровень 27
25 сентября 2023
Здравствуй. Твоё решение выдаёт перечень файлов конкретной папки. А требуется выдать все папки/файлы, которые находятся рядом с этой конкретной папкой.
Andrei Paşa Уровень 27
25 сентября 2023
Привет. К сожалению, ты ошибаешься: метод 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
Я воспринимаю класс File как устаревший, поэтому скипаю его
Alina Уровень 30
14 июня 2023
Проблема в том, что эта устаревашя модель может встречаться в рабочем проекте, которым уже лет 5-10. В таком случае нужно понимание, зачем и как этим пользоваться)
15 октября 2022
както хронология событий не вяжется. сперва в multithreading пишем архиватор, а за тем теория на эту тему в другом квесте ))
23 октября 2022
Сейчас как раз дошел до задания "Архиватор" и в комментариях сказали, что желательно сначала пройти эту тему тут =)
26 ноября 2022
Я сперва решил Коллекции пройти, а уже потом Многопоточность.
Kurama Уровень 50
5 декабря 2022
Не сосем уверен, что меня здесь ждёт, но наверное лучше б я тоже сначала это прошёл
Anonymous #3119894 Уровень 44
17 декабря 2022
Да многопоточность оставил на пол пути (пусть мозг прорастет) как то там все запуто стало , Пока пройду этот .
Edward Northwind Уровень 37
17 января 2023
Меня больше поражает то, что на Core мы работали со стримами, файловыми в частности, а к самим файлам перешли только сейчас.
Benjam1nBTN Уровень 24
1 февраля 2023
Говорят новичкам все равно работу с многопоточность не доверяют, достаточно на первых порах только теорию знать