— Привіт, Аміго. Давно не бачилися.

— Привіт, Білаабо. Про що розповідатимеш?

— Сьогодні я розповім про роботу з файлами. У Java є спеціальний клас (File), за допомогою якого можна керувати файлами на диску комп'ютера. Для того, щоб керувати вмістом файлів, є інші класи: FileInputStream, FileOutputStream,

File, Files, Path - 1

— Цікаво. А коли ти кажеш "керувати файлами", що ти маєш на увазі?

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

Можна відразу передавати ім'я файлу в FileInputStream
FileInputStream input = new FileInputStream("< span class="text-green">c:/path/a.txt");
А можна окремо створити об'єкт-файл, а потім передати його до FileInputStream
File file = new< /strong> File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

— Але в другому випадку довше виходить. Так і не зрозумів – навіщо ці файли потрібні.

— Для цього конкретного випадку – так. Це не приклад, як треба робити, а скоріше – як можна.
Але уяви, що тобі потрібно вивести на екран список всіх файлів, які знаходяться в певній директорії (папці). Ось як це можна зробити за допомогою файлів:

Код
File folder = new File("< span class="text-green">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 = новий файл("c:/path/a.txt");
String directory = file.getParent();
File file = новий файл("c:/path/a.txt");
File directory = file.getParentFile();

Якщо у тебе є рядок із шляхом до файлу, а треба об'єкт File, то скористайся конструктором. Якщо ж навпаки – є об'єкт File, а потрібний рядок – використовуй getAbsolutePath(). Приклад:

String path = "c:/a.txt";
File file = новий 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. Як це не дуже логічно, мені здається.

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

— Дякую, за чудову лекцію, Білаабо.