undefined

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. Как то это не очень логично, мне кажется.

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

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

Комментарии (65)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Игорь 22 уровень, Могилёв
15 февраля 2021
Кто пришел сюда после CORE? Не скупимся на лайк)) этож не драгоценную тёмную материю растрачивать))))
Pig Man 39 уровень
29 января 2021
File: Класс для манипуляции над самим файлом (объект класса можно передавать в качестве пути к файлу там, где он требуется). У класса File был ряд недостатков. Например, в нем не было метода copy(), который позволил бы скопировать файл из одного места в другое. Кроме того, в классе File было достаточно много методов, которые возвращали boolean. При ошибке такой метод возвращает false, а не выбрасывает исключение, что делает диагностику ошибок и установление их причин очень непростым делом Вместо единого класса File появились целых 3 класса: Paths, Path и Files Дальнейшая лекция (Добавлено) А, дальше будет про это, но можно почитать и сейчас
Никита Наумов 33 уровень, Санкт-Петербург
19 января 2021
Первая задача (рекурсия) : https://www.youtube.com/watch?v=OaltzA7uCRY&ab_channel=SergeyArkhipov
Future Man 25 уровень
18 января 2021
Блин кто прошел курс может подскажут какой лучше проходить? Этот или мультипоточность? Или де параллельно идти?
Андрей Лихтарович 40 уровень, Минск
17 января 2021
получается Риша могла бы вместо listFiles() использовать просто list(), так можно было сократить одну операцию(getName())
Антон 30 уровень, Новосибирск
23 ноября 2020
Нужно исправить: "В практически все классы" -> "Практически во все классы"
Ivan D 35 уровень
12 ноября 2020
Еще в проекте на уровне 28-м на блоке многонитиевости запомнил большинство всех этих методов))
Вячеслав 41 уровень, Ивано Франковск
1 ноября 2020
я помню как несколько месяцев назад зарегался здесь и был новичком который даже не шарил в програмырованые а сейчас я уже 31 левел. Кто тоже ето помнит ставь лайк
Dmitriy Tsoy 22 уровень, Санкт-Петербург
18 сентября 2020
А вы еще помните, что все это для того, чтобы вытащить космический корабль с этой планеты?
ram0973 41 уровень, Набережные Челны
1 сентября 2020
Что интересно, нет ни одной функции, которая возвращает содержимое, а в Path есть одна