"Szia, Amigo. Régóta, nem láttam."

"Szia, Bilaabo. Miről fogsz beszélni?"

"Ma a fájlokkal való munkáról fogok mesélni.  A Java-nak van egy speciális osztálya (File), amellyel a merevlemezen lévő fájlokat kezelheti. A fájlok tartalmának kezelésére más osztályok is vannak: FileInputStream, FileOutputStream stb. "

Fájl, fájlok, elérési út - 1

"Érdekes. De amikor azt mondod, hogy "fájlok kezelése", mire gondolsz?

"Éppen ezt fogom most elmagyarázni. Fájlokat lehet létrehozni, törölni, átnevezni és még sok minden mást. Fájl objektumot átadhat gyakorlatilag minden osztálynak, amely egy fájl tartalmával dolgozik (olvassa, írja, módosítja) . Például:"

A fájlnevet közvetlenül átadhatja a FileInputStreamnek
FileInputStream input = new FileInputStream("c:/path/a.txt");
Vagy külön is létrehozhat egy Fájl objektumot, majd átadhatja a FileInputStrea-nak
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"De a második lehetőség hosszabb. Még mindig nem értem, miért van szükségünk ezekre a fájlobjektumokra."

"Ezzel a konkrét példával kapcsolatban igazad van. "Ez nem a példa arra, hogyan kell csinálni, hanem inkább arra, hogyan teheted meg.
De képzelje el, hogy meg kell jelenítenie egy listát az összes fájlról, amely egy adott könyvtárban található. Ezt a következőképpen teheti meg a Fájlobjektumok használatával:"

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

" A listFiles() olyan metódus, amely a «c:/path/» által jelzett mappában lévő fájlok listáját adja vissza?

"Igen. De a programozók általában azt mondják, hogy "könyvtár". A "mappa" kifejezést viszonylag nemrégiben használták, de elvileg mindkét kifejezés helyes, és azt mondhatod, hogy melyiket szereted."

"OK. És mit csinál a getName ()? Visszaadja a fájl nevét? Pontosan mit tartalmaz a név? A teljes név, beleértve az elérési utat, vagy csak magának a fájlnak a neve?"

"Csak magának a fájlnak a neve. A teljes elérési úthoz a file.getAbsolutePath()."

"Szóval milyen más metódusai vannak a File osztálynak?"

"Ezt nézd meg:"

Módszer Leírás
boolean isDirectory() A File objektum egy könyvtár?
boolean isFile() Az objektum egy fájl?
long length() A fájl méretét/hosszát adja vissza bájtban.
boolean createNewFile() Új, üres fájlt hoz létre, ha még nem létezik ilyen nevű fájl.
boolean mkdir() Létrehoz egy könyvtárat. Az «mkdir» név a «make directory» szóból származik.
boolean mkdirs() Létrehoz egy könyvtárat és annak összes alkönyvtárát.
boolean delete() Törli az objektumhoz társított fájlt. Ha az objektum egy könyvtár, akkor a könyvtár csak akkor törlődik, ha nincsenek benne fájlok.
void deleteOnExit() Hozzáadja a fájlt a fájlok speciális listájához, amely automatikusan törlődik, amikor a program kilép.
File createTempFile(
String prefix,
String suffix,
File directory)
Létrehoz egy ideiglenes fájlt véletlenszerűen generált egyedi névvel, például "dasd4d53sd".
További paraméterek a név előtagja és utótagja. Ha nincs megadva könyvtár, akkor a fájl egy speciális operációs rendszer könyvtárban jön létre az ideiglenes fájlok számára.
boolean exists() Igaz értéket ad vissza, ha azonos nevű fájl található a merevlemezen.
String getAbsolutePath() Visszaadja a fájl teljes elérési útját az összes alkönyvtárával együtt.
String getCanonicalPath() A kanonikus fájl elérési útját adja vissza.
Például átalakítja a «c:/dir/dir2/../a.txt» elérési utat «c:/dir/a.txt»-re
String[] list() Az aktuális objektum által képviselt könyvtárban található fájlnevek tömbjét adja vissza.
File[] listFiles() Az aktuális File objektum által képviselt könyvtárban található fájlok tömbjét adja vissza.
long getTotalSpace() A fájl teljes területét (bájtok számát) adja vissza azon a lemezen, amelyen a fájl található.
long getFreeSpace() A szabad terület mennyiségét (bájtok számát) adja vissza azon a lemezen, amelyen a fájl található.
boolean renameTo(File) Átnevezi a fájlt, azaz a fájl tartalma ténylegesen új nevet kap. Más szavakkal, átnevezheti a «c:/dir/a.txt» fájlt «d:/out/text/b.doc»-ra.
String getName() Csak a fájlnevet adja vissza az elérési út nélkül.
String getParent() Csak az aktuális fájl elérési útját (könyvtárát) adja vissza, maga a név nélkül.
Path toPath() Egy Path objektumot ad vissza, amely megfelel az aktuális fájl objektumnak.

"Hűha! Nem túl kicsi lista, mi? És úgy tűnik, elég sok mindent megtehetsz vele: fájlokat hozhatsz létre és törölhetsz, átnevezhetsz,..."

"Tehát az aktuális fájl könyvtárának lekéréséhez meg kell hívnom a getParent()-et?"

"Igen, de egy karakterláncot ad vissza – a fájl elérési útját – nem egy Fájl objektumot. Valójában a Fájl osztály szinte az összes metódusát duplikálja: az egyik verzió egy karakterláncot, a másik egy fájl objektumot ad vissza. Nézze meg:"

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

Ha van egy karakterlánc a fájl elérési útjával, és szüksége van egy Fájl objektumra, akkor használja a konstruktort. Ha a helyzet fordított (van egy Fájl objektum, de szüksége van egy karakterláncra), akkor használja a getAbsolutePath () parancsot. Például:"

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

"Megvan."

"Remek. Akkor itt van egy kis feladat: mutasd meg az összes fájl nevét, amely ugyanabban a könyvtárban található, mint az aktuális fájl."

"Semmi sem lehet könnyebb. Tessék, nézd:"

Kód
//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());
}

"Hmm. Helyes."

"De kicsit zavaró, hogy ugyanazt az osztályt – Fájl – használják mind a fájlhoz, mind a könyvtárhoz. Ez számomra nem tűnik túl logikusnak."

"Történelmi okok miatt így alakult. A könyvtár korábban egy speciális "üres" fájl volt a lemezen. Persze mostanra sok minden megváltozott, de nem minden. Mára ennyi van."

– Köszönöm az érdekes leckét, Bilaabo.