Java >> Java tutorial >  >> Tag >> ArrayList

Læs en fil ind i en ArrayList

1. Oversigt

I dette selvstudie vil vi diskutere forskellige måder at læse en fil ind i en ArrayList .

Der er mange måder at læse en fil på i Java. Når vi har læst en fil, kan vi udføre en masse handlinger på indholdet af den fil.

Nogle af disse operationer, som sortering, kan kræve, at hele indholdet af filen behandles i hukommelsen. For at udføre sådanne handlinger, skal vi muligvis læse filen som et Array eller en liste af linjer eller ord.

2. Bruger FileReader

Den mest grundlæggende måde at læse en fil på i Java er at bruge FileReader . Per definition FileReader er en bekvemmelighedsklasse til at læse strøm af tegn fra en fil.

Der er flere tilgængelige konstruktører til at initialisere en FileReader:

FileReader f = new FileReader(String filepath);
FileReader f = new FileReader(File f);
FileReader f = new FileReader(FileDescriptor fd);

Alle disse konstruktører antager, at standardtegnkodningen og standardbyte-bufferstørrelsen er passende.

Men hvis vi ønsker at levere tilpasset tegnkodning og bytebufferstørrelse, kan vi bruge InputStreamReader eller FileInputStream .

I den følgende kode viser vi, hvordan man læser linjer fra en fil til en ArrayList, ved hjælp af FileReader:

ArrayList<String> result = new ArrayList<>();

try (FileReader f = new FileReader(filename)) {
    StringBuffer sb = new StringBuffer();
    while (f.ready()) {
        char c = (char) f.read();
        if (c == '\n') {
            result.add(sb.toString());
            sb = new StringBuffer();
        } else {
            sb.append(c);
        }
    }
    if (sb.length() > 0) {
        result.add(sb.toString());
    }
}       
return result;

3. Brug af BufferedReader

Selvom FileReader er ret nem at bruge, det er tilrådeligt altid at indpakke det med BufferReader , når du læser en fil.

Dette er fordi BufferedReader bruger en tegnbuffer til samtidig at læse flere værdier fra en karakterinputstrøm  og reducerer dermed antallet af read() opkald foretaget af den underliggende FileStream .

Konstruktører til BufferedReader tag Læser som input. Derudover kan vi også levere bufferstørrelse i konstruktørerne, men i de fleste tilfælde er standardstørrelsen stor nok:

BufferedReader br = new BufferedReader(new FileReader(filename));
BufferedReader br = new BufferedReader(new FileReader(filename), size);

Ud over de nedarvede metoder fra Reader klasse, BufferedReader også  giver readLine() metode, for at læse en hel linje som en streng:

ArrayList<String> result = new ArrayList<>();

try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
    while (br.ready()) {
        result.add(br.readLine());
    }
}

4. Brug af Scanner

En anden almindelig måde at læse filer på er gennem Scanner .

Scanner er en simpel tekstscanner, der bruges til at analysere primitive typer og strenge ved hjælp af regulære udtryk.

Når du læser filer, Scanner initialiseres ved hjælp af Fil eller FileReader objekter:

Scanner s = new Scanner(new File(filename));
Scanner s = new Scanner(new FileReader(filename));

Svarende til BufferedReader, Scanner giver readLine() metode til at læse en hel linje. Derudover  den giver også en hasNext() metode til at angive, om flere værdier er tilgængelige for læsning eller ej:

ArrayList<String> result = new ArrayList<>();

try (Scanner s = new Scanner(new FileReader(filename))) {
    while (s.hasNext()) {
        result.add(s.nextLine());
    }
    return result;
}

Scanner opdeler dets input til tokens ved hjælp af en afgrænsning, standardafgrænsningen er mellemrum. Disse tokens kan konverteres til værdier af forskellige typer ved at bruge forskellige næste  (nextInt , nextLong osv.) tilgængelige metoder:

ArrayList<Integer> result = new ArrayList<>();

try (Scanner s = new Scanner(new FileReader(filename))) {
    while (s.hasNext()) {
        result.add(s.nextInt());
    }
    return result;
}

5. Brug af Files.readAllLines

Sandsynligvis den nemmeste måde at læse en fil på og parse alle dens linjer til en ArrayList , er at bruge readAllLines()  metode tilgængelig i Filer klasse:

List<String> result = Files.readAllLines(Paths.get(filename));

Denne metode kan også tage en charset-parameter til at læse i henhold til en specifik tegnkodning:

Charset charset = Charset.forName("ISO-8859-1");
List<String> result = Files.readAllLines(Paths.get(filename), charset);

6. Konklusion

For at opsummere diskuterede vi nogle almindelige måder at læse indholdet af en fil på ind i en ArrayList . Vi dækkede også nogle fordele og ulemper ved de forskellige metoder.

For eksempel kan vi bruge BufferedReader at buffere tegn for effektivitet. Alternativt kunne vi bruge Scanner at læse primitiv ved hjælp af skilletegn. Eller måske kunne vi simpelthen bruge Files.readAllLines(), uden at bekymre dig om den underliggende implementering.

Som sædvanlig er koden tilgængelig i vores GitHub-lager.


Java tag