You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 8 Current »

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 å lese fra 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 "../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, 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:
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.

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);
        }
        
    }
}
  • No labels