Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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 "../hei.txt" få filen til å dukke opp i workspace-mappen utenfor prosjektmappen.

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:
/User/blabla/test.txt
/home/blabla/test.txt
StiBetydning
hei.txtFil 'hei.txt' i prosjektmappa.
output/hei.txt

Fil 'hei.txt' i output-mappa i prosjektmappa.

../hei.txtFil '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.txtKun på Windows: Fil 'hei.txt' i øverste mappe på diskstasjon C.
OSEksempel
Windows

C:\Users\blabla\test.txt

OS X, Linux, ol.

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);
        }
        
    }
}