Les en fil i en ArrayList

1. Oversikt

I denne opplæringen vil vi diskutere forskjellige måter å lese en fil inn i ArrayList.

Det er mange måter å lese en fil på Java. Når vi har lest en fil, kan vi utføre mange operasjoner på innholdet i den filen.

Noen av disse operasjonene, for eksempel sortering, kan kreve at hele innholdet av filen behandles i minnet. For å kunne utføre slike operasjoner, kan det hende vi må lese filen som en Array eller a Liste av linjer eller ord.

2. Bruke FileReader

Den mest grunnleggende måten å lese en fil på Java er å bruke FileReader. Per definisjon, FileReader er en praktisk klasse for å lese strøm av tegn fra en Fil.

Det er flere konstruktører tilgjengelige for å initialisere en Filleser:

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

Alle disse konstruktørene antar at standard tegnkoding og standard byte-bufferstørrelse er passende.

Imidlertid, hvis vi ønsker å gi tilpasset tegnkoding og byte bufferstørrelse, kan vi bruke InputStreamReader eller FileInputStream.

I den følgende koden vil vi demonstrere hvordan du kan lese linjer fra en fil til en ArrayList, ved hjelp av Filleser:

ArrayList resultat = ny 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 (); } annet {sb.append (c); }} hvis (sb.length ()> 0) {result.add (sb.toString ()); }} returner resultat;

3. Bruke BufferedReader

Selv om FileReader er ganske enkel å bruke, er det tilrådelig å alltid pakke den med BuffereReader, når du leser en fil.

Dette er fordi BufferedReader bruker en char-buffer for samtidig å lese flere verdier fra en tegninputstrøm og reduserer dermed antall lese() samtaler fra den underliggende FileStream.

Konstruktører for BufferedReader ta Leser som innspill. I tillegg kan vi også tilby bufferstørrelse i konstruktørene, men for de fleste bruksområder er standardstørrelsen stor nok:

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

I tillegg til de arvede metodene fra Leser klasse, BufferedReader også gir readLine () metode, å lese en hel linje som en Streng:

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

4. Bruke Skanner

En annen vanlig måte å lese filer på er gjennom Skanner.

Skanner er en enkel tekstskanner, brukt til å analysere primitive typer og strenger, ved å bruke regulære uttrykk.

Når du leser filer, Skanner initialiseres med Fil eller FileReader gjenstander:

Skanner s = ny skanner (ny fil (filnavn)); Skanner s = ny skanner (ny FileReader (filnavn));

Lik BufferedReader, skanner gir readLine () metode for å lese en hel linje. I tillegg, det gir også en hasNext () metode for å indikere om flere verdier er tilgjengelige for lesing eller ikke:

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

Skanner bryter sine innspill i tokens ved hjelp av en skilletegn, standard skilletegn er mellomrom. Disse tokens kan konverteres til verdier av forskjellige typer, ved hjelp av forskjellige neste (nesteInt, nesteLang, etc) tilgjengelige metoder:

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

5. Bruke Files.readAllLines

Sannsynligvis den enkleste måten å lese en fil, og parsere alle linjene til en ArrayList, er å bruke readAllLines () metoden tilgjengelig i Filer klasse:

Liste resultat = Files.readAllLines (Paths.get (filnavn));

Denne metoden kan også ta en tegnsettparameter for å lese i henhold til en spesifikk tegnkoding:

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

6. Konklusjon

For å oppsummere diskuterte vi noen vanlige måter å lese innholdet i Fil inn i en ArrayList. Vi dekket også noen fordeler og ulemper ved de forskjellige metodene.

For eksempel kan vi bruke BufferedReader for å buffere tegn for effektivitet. Alternativt kan vi bruke Skanner å lese primitive ved hjelp av avgrensere. Eller kanskje vi bare kan bruke Files.readAllLines (), uten å bekymre deg for den underliggende implementeringen.

Som vanlig er koden tilgjengelig i GitHub-depotet vårt.