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.