"Cześć, Amigo. Dawno się nie widzieliśmy."

„Cześć, Bilaabo. O czym zamierzasz rozmawiać?”

„Dzisiaj opowiem o pracy z plikami.  Java ma specjalną klasę (File), której można używać do zarządzania plikami na dysku twardym. Do zarządzania zawartością plików służą inne klasy: FileInputStream, FileOutputStream itp. "

Plik, pliki, ścieżka - 1

„Interesujące. Ale kiedy mówisz „zarządzaj plikami”, co masz na myśli?

„Właśnie to teraz wyjaśnię. Pliki można tworzyć, usuwać, zmieniać ich nazwy i wiele więcej. Możesz przekazać obiekt File praktycznie każdej klasie, która pracuje z (odczytuje, zapisuje, zmienia) zawartość pliku . Na przykład:"

Możesz przekazać nazwę pliku bezpośrednio do FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
Możesz też utworzyć obiekt File oddzielnie, a następnie przekazać go do FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

„Ale druga opcja jest dłuższa. Nadal nie rozumiem, po co nam te obiekty plików”.

„W tym konkretnym przykładzie masz rację. „To nie jest przykład tego, jak musisz to zrobić, ale raczej, jak możesz to zrobić.
Ale wyobraź sobie, że musisz wyświetlić listę wszystkich plików znajdujących się w określonym katalogu. Oto jak można to zrobić za pomocą obiektów File:"

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

„Czy listFiles() jest metodą, która zwraca listę plików w folderze wskazanym przez «c:/ścieżka/»?”

„Tak. Ale programiści zwykle mówią „katalog”. Termin „folder” pojawił się stosunkowo niedawno, ale w zasadzie oba terminy są poprawne i możesz wybrać, który wolisz.

„OK. A co robi funkcja getName ()? Zwraca nazwę pliku? Co dokładnie zawiera nazwa? Pełna nazwa wraz ze ścieżką, czy tylko sama nazwa pliku?”

„Tylko nazwa samego pliku. Pełna ścieżka to file.getAbsolutePath().”

„Więc jakie inne metody ma klasa File?”

"Popatrz na to:"

metoda Opis
boolean isDirectory() Czy obiekt File jest katalogiem?
boolean isFile() Czy obiekt jest plikiem?
long length() Zwraca rozmiar/długość pliku w bajtach.
boolean createNewFile() Tworzy nowy, pusty plik, jeśli plik o tej nazwie jeszcze nie istnieje.
boolean mkdir() Tworzy katalog. Nazwa «mkdir» pochodzi od «make directory».
boolean mkdirs() Tworzy katalog i wszystkie jego podkatalogi.
boolean delete() Usuwa plik skojarzony z obiektem. Jeśli obiektem jest katalog, to katalog jest usuwany tylko wtedy, gdy nie ma w nim żadnych plików.
void deleteOnExit() Dodaje plik do specjalnej listy plików, które zostaną automatycznie usunięte po zamknięciu programu.
File createTempFile(
String prefix,
String suffix,
File directory)
Tworzy plik tymczasowy z losowo generowaną unikalną nazwą, na przykład «dasd4d53sd».
Dodatkowymi parametrami są przedrostek i sufiks nazwy. Jeśli katalog nie jest określony, plik jest tworzony w specjalnym katalogu systemu operacyjnego dla plików tymczasowych.
boolean exists() Zwraca wartość true, jeśli na dysku twardym istnieje plik o tej samej nazwie.
String getAbsolutePath() Zwraca pełną ścieżkę pliku ze wszystkimi jego podkatalogami.
String getCanonicalPath() Zwraca kanoniczną ścieżkę do pliku.
Na przykład konwertuje ścieżkę «c:/dir/dir2/../a.txt» na «c:/dir/a.txt»
String[] list() Zwraca tablicę nazw plików zawartych w katalogu reprezentowanym przez bieżący obiekt.
File[] listFiles() Zwraca tablicę plików zawartych w katalogu reprezentowanym przez bieżący obiekt File.
long getTotalSpace() Zwraca ilość całkowitego miejsca (liczbę bajtów) na dysku, na którym znajduje się plik.
long getFreeSpace() Zwraca ilość wolnego miejsca (liczbę bajtów) na dysku, na którym znajduje się plik.
boolean renameTo(File) Zmienia nazwę pliku, tzn. zawartość pliku faktycznie otrzymuje nową nazwę. Innymi słowy, możesz zmienić nazwę pliku „c:/dir/a.txt” na „d:/out/text/b.doc”.
String getName() Zwraca tylko nazwę pliku bez ścieżki.
String getParent() Zwraca tylko ścieżkę (katalog) do bieżącego pliku, bez samej nazwy.
Path toPath() Zwraca obiekt Path, który odpowiada bieżącemu obiektowi File.

„Wow! Niezbyt mała lista, co? I wygląda na to, że możesz z nią zrobić całkiem sporo: tworzyć i usuwać pliki, zmieniać ich nazwy...”

„Więc aby uzyskać katalog bieżącego pliku, muszę wywołać getParent()?”

„Tak, ale zwraca String — ścieżkę do pliku — a nie obiekt File. Właściwie klasa File duplikuje prawie wszystkie swoje metody: jedna wersja zwraca String, a druga — obiekt File. Sprawdź to:”

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

Jeśli masz String ze ścieżką do pliku i potrzebujesz obiektu File , użyj konstruktora. Jeśli sytuacja jest odwrotna (masz obiekt File , ale potrzebujesz String), użyj getAbsolutePath (). Na przykład:"

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

"Rozumiem."

„Świetnie. Oto małe zadanie dla ciebie: pokaż nazwy wszystkich plików znajdujących się w tym samym katalogu co bieżący plik”.

„Nic nie może być prostsze. Proszę, spójrz:”

Kod
//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());
}

„Hm. Zgadza się”.

„Ale to trochę mylące, że ta sama klasa — Plik — jest używana zarówno dla pliku, jak i dla katalogu. Nie wydaje mi się to zbyt logiczne”.

„Tak to działało z powodów historycznych. Katalog był kiedyś specjalnym„ pustym ”plikiem na dysku. Oczywiście teraz wiele się zmieniło, ale nie wszystko. To wszystko, co mam dzisiaj”.

„Dzięki za interesującą lekcję, Bilaabo”.