"Hallo, Amigo. Lang niet gezien."

"Hallo, Bilaabo. Waar ga je het over hebben?"

"Vandaag ga ik je vertellen over het werken met bestanden.  Java heeft een speciale klasse (File) die je kunt gebruiken om bestanden op een harde schijf te beheren. Voor het beheren van bestandsinhoud zijn er andere klassen: FileInputStream, FileOutputStream, etc. "

Bestand, Bestanden, Pad - 1

"Interessant. Maar als je zegt 'bestanden beheren', wat bedoel je dan?"

"Dat is precies wat ik nu ga uitleggen. Bestanden kunnen worden gemaakt, verwijderd, hernoemd en nog veel meer. U kunt een File-object doorgeven aan vrijwel elke klasse die werkt met (leest, schrijft, wijzigt) de inhoud van een bestand . Bijvoorbeeld:"

U kunt de bestandsnaam rechtstreeks doorgeven aan FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
Of u kunt afzonderlijk een File-object maken en dit vervolgens doorgeven aan FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"Maar de tweede optie is langer. Ik begrijp nog steeds niet waarom we deze bestandsobjecten nodig hebben."

"Voor dit specifieke voorbeeld heb je gelijk. "Dit is geen voorbeeld van hoe je het moet doen, maar eerder hoe je het kunt doen.
Maar stel je voor dat je een lijst moet weergeven van alle bestanden die zich in een specifieke map bevinden. Hier ziet u hoe dit kan worden gedaan met behulp van Bestandsobjecten:"

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

"Is listFiles() een methode die een lijst met bestanden retourneert in de map aangegeven door «c:/path/»?"

"Ja. Maar programmeurs zeggen meestal 'directory'. De term 'map' is relatief recent in gebruik genomen, maar in principe zijn beide termen correct en kun je zeggen wat je wilt."

"OK. En wat doet getName ()? Geeft de naam van het bestand weer? Wat staat er precies in de naam? De volledige naam inclusief het pad, of alleen de naam van het bestand zelf?"

"Alleen de naam van het bestand zelf. Voor het volledige pad is er file.getAbsolutePath()."

"Dus welke andere methoden heeft de klasse File?"

"Kijk hier eens even naar:"

Methode Beschrijving
boolean isDirectory() Is het File-object een directory?
boolean isFile() Is het object een bestand?
long length() Retourneert de bestandsgrootte/lengte in bytes.
boolean createNewFile() Maakt een nieuw, leeg bestand aan als er nog geen bestand met deze naam bestaat.
boolean mkdir() Maakt een map aan. De naam «mkdir» komt van «make directory».
boolean mkdirs() Creëert een map en al zijn submappen.
boolean delete() Verwijdert het bestand dat aan het object is gekoppeld. Als het object een map is, wordt de map alleen verwijderd als er geen bestanden in staan.
void deleteOnExit() Voegt het bestand toe aan een speciale lijst met bestanden die automatisch worden verwijderd wanneer het programma wordt afgesloten.
File createTempFile(
String prefix,
String suffix,
File directory)
Creëert een tijdelijk bestand met een willekeurig gegenereerde unieke naam, zoiets als «dasd4d53sd».
Aanvullende parameters zijn een naamvoorvoegsel en achtervoegsel. Als er geen map is opgegeven, wordt het bestand gemaakt in een speciale OS-map voor tijdelijke bestanden.
boolean exists() Retourneert true als er een bestand met dezelfde naam op de harde schijf staat.
String getAbsolutePath() Retourneert het volledige pad van het bestand met al zijn submappen.
String getCanonicalPath() Retourneert het canonieke bestandspad.
Converteert bijvoorbeeld het pad «c:/dir/dir2/../a.txt» naar «c:/dir/a.txt»
String[] list() Retourneert een matrix met de namen van bestanden in de map die wordt vertegenwoordigd door het huidige object.
File[] listFiles() Retourneert een reeks bestanden in de directory die wordt vertegenwoordigd door het huidige File-object.
long getTotalSpace() Retourneert de hoeveelheid totale ruimte (aantal bytes) op de schijf waarop het bestand zich bevindt.
long getFreeSpace() Retourneert de hoeveelheid vrije ruimte (aantal bytes) op de schijf waarop het bestand zich bevindt.
boolean renameTo(File) Hernoemt het bestand, dwz de inhoud van het bestand krijgt daadwerkelijk een nieuwe naam. Met andere woorden, u kunt het bestand «c:/dir/a.txt» hernoemen naar «d:/out/text/b.doc».
String getName() Retourneert alleen de bestandsnaam zonder het pad.
String getParent() Retourneert alleen het pad (directory) naar het huidige bestand, zonder de naam zelf.
Path toPath() Retourneert een Path-object dat overeenkomt met het huidige File-object.

"Ho! Geen heel klein lijstje, hè? En het lijkt erop dat je er best veel mee kunt doen: bestanden aanmaken en verwijderen, hernoemen,..."

"Dus om de directory van het huidige bestand te krijgen, moet ik getParent() aanroepen?"

"Ja, maar het retourneert een String ― het bestandspad ― geen File-object. Eigenlijk dupliceert de File-klasse bijna al zijn methoden: de ene versie retourneert een String, de andere ― een File-object. Bekijk het eens:"

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

Als je een string hebt met het bestandspad en je hebt een File- object nodig, gebruik dan de constructor. Als de situatie omgekeerd is (je hebt een File- object maar je hebt een String nodig), gebruik dan getAbsolutePath (). Bijvoorbeeld:"

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

"Begrepen."

"Geweldig. Dan is hier een kleine taak voor je: toon de namen van alle bestanden die zich in dezelfde map bevinden als het huidige bestand."

"Niets is eenvoudiger. Hier, kijk:"

Code
//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. Klopt."

"Maar het is een beetje verwarrend dat dezelfde klasse - File - wordt gebruikt voor zowel het bestand als de directory. Dat lijkt me niet erg logisch."

"Om historische redenen werkte dat zo. Vroeger was een directory een speciaal 'leeg' bestand op schijf. Natuurlijk is er nu veel veranderd, maar niet alles. Dat is alles wat ik vandaag heb."

"Bedankt voor de interessante les, Bilaabo."