Fordi filer er såpass enkle konsepter, er det mye som må tas hensyn til når man skal lese og skrive til filer. I utgangspunktet, er innholdet i filer en samling av bytes. Når man skal lese en fil, vil operativsystemet gi deg bare et 'rør' som innholdet til filen kommer ut av. Inholdet kommer altså inn i programmet i form av en strøm av byte-ne filen består av. Hvis du jobber med tekst, må disse så tolkes om til tekstlige tegn. Deretter jobber man vanligvis med flere teng samtidig. For eksempel hele ord eller linjer. - så man blir nødt til å håndtere dette. Når man skriver til fil, må noe lignende skje i motsatt rekkefølge.
Dette høres ut som mye jobb - og det er det, men java kommer utstyrt med klasser som gjør dette for deg:
Lesing fra fil
For å lese fra en fil, kan du instansiere et FileReader-objekt og gi det til en Scanner:
...
Se java.util.Scanner for hvordan man bruker Scanneren du får.
Skriving til fil
For å lese fra skrive til en fil, kan du instansiere en java.io.PrintWriter:
...
Når du vil si deg ferdig med å skrive til filen, har PrintWriter en close()-metode som fullfører eventuell utsatt skriving og lukker filen.
Filnavn
Filnavnet/stien vil være relativt til 'parrent working directory', som i Eclipse er mappen til prosjektet som main-metoden ligger i (med mindre du har satt det til noe annet). Dette vil si at hvis Eclipse sitt workspace ligger i hjemmemappen din og heter 'workspace', og du jobber i prosjektet 'TDT4100', og du sier new PrintWriter("hei.txt")
, vil denne filen dukke opp i mappen TDT4100 i workspace i hjemmemappen din.
Du kan gi PrintWriter en sti i stedet for bare filnavnet, slik at du styrer hvilken mappe filen dukker opp i. Her er det litt forsjell på hvordan stier oppgis i Windows i motsettning til andre operativsystemer som OS X, Linux, o.l. Windows og andre bruker \ og / henholdsvis for å separere mapper og filnavn. For å skrive til filen hei.txt i mappen 'output' i prosjektmappen, blir stien på Windows "output\hei.txt", mens den ellers blir "output/hei.txt". Legg merke til at \ har spessiel betydning i Java-strenger, og må escapes med en til \. For Windows, Eksempelvis, vil det alså se ut som new PrintWriter("output\\/hei.txt");
Det er også mulig å bruke det spessiele mappenavnet ..
(dobbel dot) til å bety mappen over. For eksempel, vil
få filen til å dukke opp i workspace-mappen utenfor prosjektmappen."../hei.txt"
Hvis du ikke ønsker at stien skal være relativ, kan du spesifiere en absolutt sti. Absolutte stier begynner med en skråstrek. I Windows kan man , vil stien fortsatt være relativ til diskstasjonen 'parent working directory' er på. Men, men kan også spesifiere hvilken diskstasjon stien omhandler:diskstasjon ved å skrive stasjonsnavnet og kolon foran.
Eksempler på stier:
Sti | Betydning |
---|---|
hei.txt | Fil 'hei.txt' i prosjektmappa. |
output/hei.txt | Fil 'hei.txt' i output-mappa i prosjektmappa. |
../hei.txt | Fil 'hei.txt' i workspace-mappa, én opp fra prosjektmappa. |
/hei.txt | Fil 'hei.txt' i den øverste mappen på filsystemet. For Windows er dette fortsatt på samme diskstasjon. |
C:/hei.txt | Kun på Windows: Fil 'hei.txt' i øverste mappe på diskstasjon C. |
OS | Eksempel |
Windows | C:/Users/blabla/test.txt |
OS X, Linux, ol. | /User/blabla/test.txt
Eksempler
Lese fra fil:
Code Block |
---|
import java.io.FileNotFoundException; import java.io.FileReader; import java.util.Scanner; class ReadingAFile { public static void main(String[] args) { Scanner in; try { in = new Scanner(new FileReader("test.txt")); while(in.hasNext()){ String line = in.nextLine(); System.out.println(line); } in.close(); } catch (FileNotFoundException e) { System.err.println("Error: file 'test.txt' could not be opened. Does it exist?"); System.exit(1); } } } |
Skrive til fil:
Code Block |
---|
import java.io.FileNotFoundException; import java.io.PrintWriter; class WritingAFile { public static void main(String[] args) { try { PrintWriter outFile = new PrintWriter("test.txt"); outFile.println("hello world!"); outFile.close(); } catch (FileNotFoundException e) { System.err.println("Error: file 'test.txt' could not be opened for writing."); System.exit(1); } } } |