„Здрасти, Амиго. Отдавна не сме се виждали.“

„Здрасти, Билаабо. За Howво ще говориш?“

"Днес ще ви разкажа за работата с файлове.  Java има специален клас (File), който можете да използвате за управление на файлове на твърд диск. За управление на съдържанието на file има други класове: FileInputStream, FileOutputStream и т.н. "

Файл, файлове, път - 1

„Интересно. Но когато казвате „управление на файлове“, Howво имате предвид?“

„Точно това ще обясня сега. Файловете могат да се създават, изтриват, преименуват и много повече. Можете да предадете File обект на практически всеки клас, който работи с (чете, пише, променя) съдържанието на файл . Например:"

Можете да предадете името на file директно на FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
Или можете да създадете File обект отделно и след това да го предадете на FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"Но вторият вариант е по-дълъг. Все още не разбирам защо имаме нужда от тези файлови обекти."

„За този конкретен пример сте прав. „Това не е пример за това How трябва да го направите, а по-скоро How можете да го направите.
Но представете си, че трябва да покажете списък с всички файлове, намиращи се в определена директория. Ето How може да се направи това с помощта на файлови обекти:"

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

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

"Да. Но програмистите обикновено казват "директория". Терминът "папка" се използва сравнително наскоро, но по принцип и двата термина са правилни и можете да кажете, който предпочитате."

"ОК. И Howво прави getName ()? Връща името на file? Какво точно е включено в името? Пълното име, включително пътя, or само името на самия файл?"

„Само името на самия файл. За пълния път има file.getAbsolutePath().“

„И така, Howви други методи има класът File?“

"Погледни това:"

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

„Уау! Не е много малък списък, а? И изглежда, че можете да правите доста с него: да създавате и изтривате файлове, да ги преименувате,...“

„Значи, за да получа директорията на текущия файл, трябва да извикам getParent()?“

„Да, но той връща String ― пътя на file ― не File обект. Всъщност класът File дублира почти всички свои методи: едната version връща 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();

Ако имате String с пътя на file и имате нужда от File обект, тогава използвайте конструктора. Ако ситуацията е обратна (имате File обект, но имате нужда от String), тогава използвайте getAbsolutePath (). Например:"

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

"Схванах го."

"Страхотно. Тогава ето една малка задача за вас: покажете имената на всички файлове, намиращи се в същата директория като текущия файл."

„Нищо не може да бъде по-лесно. Ето, вижте:“

Код
//Some file
File originalFile = new File("c:/path/dir2/a.txt");

//An object representing the directory
File folder = originalFile.getParentFile();

//Print the file list on screen
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

"Хмм. Правилно."

„Но е малко объркващо, че един и същи клас ― File ― се използва Howто за file, така и за директорията. Това не ми се струва много логично.“

„Така се получи по исторически причини. Преди директорията беше специален „празен“ файл на диска. Разбира се, сега много се е променило, но не всичко. Това е всичко, което имам днес.“

— Благодаря за интересния урок, Билаабо.