Læs en fil i en ArrayList

1. Oversigt

I denne vejledning diskuterer vi forskellige måder at læse en fil i en ArrayList.

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

Nogle af disse handlinger, som f.eks. Sortering, kan kræve, at hele filens indhold behandles i hukommelsen. For at udføre sådanne operationer er vi muligvis nødt til at læse filen som en Array eller a Liste af linjer eller ord.

2. Brug FileReader

Den mest grundlæggende måde at læse en fil på i Java bruger FileReader. Per definition, FileReader er en bekvemmelighedsklasse til læsning af karakterer fra en Fil.

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

FileReader f = ny FileReader (streng filbane); FileReader f = ny FileReader (File f); FileReader f = ny FileReader (FileDescriptor fd);

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

Men hvis vi vil give brugerdefineret tegnkodning og bytebufferstørrelse, kan vi bruge det InputStreamReader eller FileInputStream.

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

ArrayList resultat = nyt ArrayList (); prøv (FileReader f = ny FileReader (filnavn)) {StringBuffer sb = ny StringBuffer (); mens (f.ready ()) {char c = (char) f.read (); hvis (c == '\ n') {result.add (sb.toString ()); sb = ny StringBuffer (); } andet {sb.append (c); }} hvis (sb.length ()> 0) {result.add (sb.toString ()); }} returner resultat;

3. Brug BufferedReader

Selvom FileReader er ret let at bruge, anbefales det altid at pakke den med BuffereReader, når du læser en fil.

Dette er fordi BufferedReader bruger en char-buffer til samtidig at læse flere værdier fra en tegninputstrøm og reducerer dermed antallet af Læs() opkald foretaget af den underliggende FileStream.

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

BufferedReader br = ny BufferedReader (ny FileReader (filnavn)); BufferedReader br = ny BufferedReader (ny FileReader (filnavn), størrelse);

Ud over de arvede metoder fra Læser klasse, BufferedReader også giver readLine () metode til at læse en hel linje som en Snor:

ArrayList resultat = nyt ArrayList (); prøv (BufferedReader br = ny BufferedReader (ny FileReader (filnavn))) {mens (br.ready ()) {result.add (br.readLine ()); }} 

4. Brug Scanner

En anden almindelig måde at læse filer på er 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 genstande:

Scanner s = ny Scanner (ny fil (filnavn)); Scanner s = ny Scanner (ny FileReader (filnavn));

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

ArrayList resultat = nyt ArrayList (); prøv (Scanner s = ny Scanner (ny FileReader (filnavn))) {mens (s.hasNext ()) {result.add (s.nextLine ()); } returnere resultat }

Scanner bryder sit input i tokens ved hjælp af en afgrænser, idet standardafgrænser er mellemrum. Disse tokens kan konverteres til værdier af forskellige typer ved hjælp af forskellige Næste (næsteInt, næsteLangosv.) tilgængelige metoder:

ArrayList resultat = nyt ArrayList (); prøv (Scanner s = ny Scanner (ny FileReader (filnavn))) {mens (s.hasNext ()) {result.add (s.nextInt ()); } returnere resultat }

5. Brug 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:

Listeresultat = Files.readAllLines (Paths.get (filnavn));

Denne metode kan også tage en tegnsætparameter til at læse i henhold til en bestemt tegnkodning:

Charset charset = Charset.forName ("ISO-8859-1"); Listeresultat = Files.readAllLines (Paths.get (filnavn), tegnsæt);

6. Konklusion

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

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

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