"Hei, Amigo. Lenge, ikke sett."

"Hei, Bilaabo. Hva skal du snakke om?"

"I dag skal jeg fortelle deg om arbeid med filer.  Java har en spesiell klasse (File) som du kan bruke til å administrere filer på en harddisk. For å administrere filinnhold finnes det andre klasser: FileInputStream, FileOutputStream, etc. "

Fil, filer, bane - 1

"Interessant. Men når du sier 'behandle filer', hva mener du?"

"Det er akkurat det jeg skal forklare nå. Filer kan opprettes, slettes, gi nytt navn og mye mer. Du kan sende et filobjekt til praktisk talt hver klasse som jobber med (leser, skriver, endrer) innholdet i en fil . For eksempel:"

Du kan sende filnavnet direkte til FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
Eller du kan opprette et filobjekt separat, og deretter sende det til FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"Men det andre alternativet er lengre. Jeg forstår fortsatt ikke hvorfor vi trenger disse filobjektene."

"For dette spesifikke eksemplet har du rett. "Dette er ikke et eksempel på hvordan du må gjøre det, men heller hvordan du kan gjøre det.
Men forestill deg at du må vise en liste over alle filer som ligger i en bestemt katalog. Slik kan dette gjøres ved å bruke filobjekter:"

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

"Er listFiles() en metode som returnerer en liste over filer i mappen indikert med «c:/path/»?"

"Ja. Men programmerere sier vanligvis 'katalog'. Begrepet 'mappe' kom i bruk relativt nylig, men i prinsippet er begge begrepene riktige, og du kan si hva du foretrekker."

"OK. Og hva gjør getName ()? Returner navnet på filen? Hva er inkludert i navnet? Det fulle navnet inkludert banen, eller bare navnet på selve filen?"

"Bare navnet på selve filen. For den fullstendige banen er det file.getAbsolutePath()."

"Så hvilke andre metoder har File-klassen?"

"Se på dette:"

Metode Beskrivelse
boolean isDirectory() Er File-objektet en katalog?
boolean isFile() Er objektet en fil?
long length() Returnerer filstørrelsen/lengden i byte.
boolean createNewFile() Oppretter en ny, tom fil hvis en fil med dette navnet ikke eksisterer ennå.
boolean mkdir() Oppretter en katalog. Navnet «mkdir» kommer fra «make directory».
boolean mkdirs() Oppretter en katalog og alle dens underkataloger.
boolean delete() Sletter filen knyttet til objektet. Hvis objektet er en katalog, slettes katalogen bare hvis det ikke er noen filer i den.
void deleteOnExit() Legger til filen i en spesiell liste over filer som automatisk slettes når programmet avsluttes.
File createTempFile(
String prefix,
String suffix,
File directory)
Oppretter en midlertidig fil med et tilfeldig generert unikt navn, noe sånt som «dasd4d53sd».
Ytterligere parametere er et navn prefiks og suffiks. Hvis en katalog ikke er spesifisert, opprettes filen i en spesiell OS-katalog for midlertidige filer.
boolean exists() Returnerer sant hvis en fil med samme navn finnes på harddisken.
String getAbsolutePath() Returnerer hele banen til filen med alle underkatalogene.
String getCanonicalPath() Returnerer den kanoniske filbanen.
Konverterer for eksempel banen «c:/dir/dir2/../a.txt» til «c:/dir/a.txt»
String[] list() Returnerer en matrise med navn på filer i katalogen som er representert av det gjeldende objektet.
File[] listFiles() Returnerer en rekke filer i katalogen representert av det gjeldende filobjektet.
long getTotalSpace() Returnerer mengden total plass (antall byte) på disken som filen er plassert på.
long getFreeSpace() Returnerer mengden ledig plass (antall byte) på disken som filen er plassert på.
boolean renameTo(File) Gi nytt navn til filen, dvs. at innholdet i filen faktisk får et nytt navn. Du kan med andre ord endre navn på filen «c:/dir/a.txt» til «d:/out/text/b.doc».
String getName() Returnerer bare filnavnet uten banen.
String getParent() Returnerer bare banen (katalogen) til gjeldende fil, uten selve navnet.
Path toPath() Returnerer et baneobjekt som tilsvarer det gjeldende filobjektet.

"Wow! Ikke en veldig liten liste, ikke sant? Og det virker som du kan gjøre ganske mye med det: opprette og slette filer, gi dem nytt navn,..."

"Så for å få katalogen til den gjeldende filen, må jeg ringe getParent()?"

"Jepp, men den returnerer en streng - filbanen - ikke et filobjekt. Faktisk dupliserer File-klassen nesten alle metodene: en versjon returnerer en streng, den andre - et filobjekt. Sjekk det ut:"

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

Hvis du har en streng med filbanen og du trenger et filobjekt , bruk konstruktøren. Hvis situasjonen er omvendt (du har et filobjekt , men du trenger en streng), så bruk getAbsolutePath (). For eksempel:"

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

"Har det."

"Flott. Så her er en liten oppgave for deg: vis navnene på alle filene som ligger i samme katalog som den gjeldende filen."

"Ingenting kunne vært enklere. Her, se:"

Kode
//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. Riktig."

"Men det er litt forvirrende at den samme klassen ― File ― brukes for både filen og katalogen. Det virker ikke veldig logisk for meg."

"Det fungerte slik av historiske årsaker. En katalog pleide å være en spesiell "tom" fil på disken. Selvfølgelig har mye endret seg nå, men ikke alt. Det er alt jeg har i dag."

"Takk for den interessante leksjonen, Bilaabo."