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:
Scanner inFile = new Scanner(new FileReader(filepath));
Konstruktøren til FileReader kaster et sjekket untak: FileNotFoundException hvis filen av en eller annen grunn ikke kan åpnes. Dette kan være fordi filen ikke finnes, fordi det ikke er en fil (men en mappe) eller fordi programmet ikke har tilgang til å åpne filen.
Se java.util.Scanner for hvordan man bruker Scanneren du får.
Skriving til fil
For å skrive til en fil, kan du instansiere en java.io.PrintWriter:
PrintWriter file = new PrintWriter(filepath);
Filen på stien filepath
vil hvis den finnes, tømmes for innhold, eller opprettes hvis den ikke finnes. Mappen filen skal ligge må allerede finnes.
Konstruktøren til PrintWriter kaster et unntak: FileNotFoundException. Dette sker hvis mappen som filen skal ligge i ikke finnes og når programmet ikke får skrivetilgang. Untaket er sjekket, så det må fanges, eller så må metoden man instansierer PrintWriter i deklarere throws FileNotFoundException
. Dette vil Eclipse hjelpe deg med.
Et PrintWriter-objekt har har metodene print
og println
som oppfører seg slik man er vandt med System.out.print
og System.out.println
.
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. For å skrive til filen hei.txt i mappen 'output' i prosjektmappen, blir stien "output/hei.txt". 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, vil stien fortsatt være relativ til diskstasjonen 'parent working directory' er på. Men, men kan også spesifiere 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. |
Eksempler
Lese fra fil:
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:
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); } } }