— Привет, Амиго. Давно не виделись.
— Привет, Билаабо. О чем будешь рассказывать?
— Сегодня я расскажу о работе с файлами. В Java есть специальный класс (File), с помощью которого можно управлять файлами на диске компьютера. Для того чтобы управлять содержимым файлов, есть другие классы: FileInputStream, FileOutputStream,…
— Интересно. А когда ты говоришь «управлять файлами», что ты имеешь в виду?
— Как раз сейчас и расскажу. Файлы можно создавать, удалять, переименовывать и еще много чего. Практически во все классы, которые работают (читают, пишут, изменяют) с содержимым файла, можно передавать объект класса File. Пример:
FileInputStream input = new FileInputStream("c:/path/a.txt");
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. Как то это не очень логично, мне кажется.
— Так исторически сложилось. Раньше директория была специальным «пустым» файлом на диске. Сейчас уже, конечно, многое изменилось, но не везде. У меня на сегодня все.
— Спасибо, за отличную лекцию, Билаабо.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ