Lees een bestand in een ArrayList

1. Overzicht

In deze tutorial bespreken we verschillende manieren om een ​​bestand in een ArrayList.

Er zijn veel manieren om een ​​bestand in Java te lezen. Zodra we een bestand hebben gelezen, kunnen we veel bewerkingen uitvoeren op de inhoud van dat bestand.

Voor sommige van deze bewerkingen, zoals sorteren, moet de volledige inhoud van het bestand in het geheugen worden verwerkt. Om dergelijke bewerkingen uit te voeren, moeten we het bestand mogelijk lezen als een Array of een Lijst regels of woorden.

2. Met behulp van FileReader

De meest eenvoudige manier om een ​​bestand in Java te lezen, is met FileReader. Per definitie, FileReader is een gemaksklasse voor het lezen van een stroom tekens van een Het dossier.

Er zijn meerdere constructors beschikbaar om een FileReader:

FileReader f = nieuwe FileReader (String filepath); FileReader f = nieuwe FileReader (bestand f); FileReader f = nieuwe FileReader (FileDescriptor fd);

Al deze constructors gaan ervan uit dat de standaard tekencodering en de standaard bytebuffergrootte geschikt zijn.

Als we echter aangepaste tekencodering en bytebuffergrootte willen bieden, kunnen we InputStreamReader of FileInputStream.

In de volgende code laten we zien hoe u regels uit een bestand in een ArrayList, gebruik makend van FileReader:

ArrayList resultaat = nieuwe ArrayList (); probeer (FileReader f = nieuwe FileReader (bestandsnaam)) {StringBuffer sb = nieuwe StringBuffer (); while (f.ready ()) {char c = (char) f.read (); if (c == '\ n') {resultaat.add (sb.toString ()); sb = nieuwe StringBuffer (); } anders {sb.append (c); }} if (sb.length ()> 0) {resultaat.add (sb.toString ()); }} resultaat retourneren;

3. Met behulp van BufferedReader

Hoewel FileReader is vrij gemakkelijk te gebruiken, het is raadzaam om het altijd mee te wikkelen BuffereReader, bij het lezen van een bestand.

Dit is zo omdat BufferedReader gebruikt een char-buffer om tegelijkertijd meerdere waarden uit een tekeninvoerstroom te lezen en dus vermindert het aantal lezen() oproepen gedaan door de onderliggende Bestandsstroom.

Constructeurs voor BufferedReader nemen Lezer als input. Bovendien kunnen we ook buffergrootte voorzien in de constructors, maar in de meeste gevallen is de standaardgrootte groot genoeg:

BufferedReader br = nieuwe BufferedReader (nieuwe FileReader (bestandsnaam)); BufferedReader br = nieuwe BufferedReader (nieuwe FileReader (bestandsnaam), grootte);

Naast de overgeërfde methoden van de Lezer klasse, BufferedReader ook biedt Lees regel() methode, om een ​​hele regel te lezen als een Draad:

ArrayList resultaat = nieuwe ArrayList (); probeer (BufferedReader br = nieuwe BufferedReader (nieuwe FileReader (bestandsnaam))) {while (br.ready ()) {result.add (br.readLine ()); }} 

4. Met behulp van Scanner

Een andere veelgebruikte manier om bestanden te lezen is via Scanner.

Scanner is een eenvoudige tekstscanner die wordt gebruikt voor het ontleden van primitieve typen en tekenreeksen met behulp van reguliere expressies.

Bij het lezen van bestanden Scanner wordt geïnitialiseerd met het dossier of FileReader voorwerpen:

Scanner s = nieuwe scanner (nieuw bestand (bestandsnaam)); Scanner s = nieuwe scanner (nieuwe FileReader (bestandsnaam));

Gelijkwaardig aan BufferedReader, Scanner biedt Lees regel() methode om een ​​hele regel te lezen. Bovendien, het biedt ook een hasNext () methode om aan te geven of er meer waarden beschikbaar zijn om te lezen of niet:

ArrayList resultaat = nieuwe ArrayList (); probeer (Scanner s = nieuwe scanner (nieuwe FileReader (bestandsnaam))) {while (s.hasNext ()) {result.add (s.nextLine ()); } resultaat teruggeven; }

Scanner breekt zijn invoer in tokens met behulp van een scheidingsteken, het standaard scheidingsteken is witruimte. Deze tokens kunnen worden omgezet in waarden van verschillende typen, door verschillende te gebruiken De volgende (volgendeInt, nextLong, etc) beschikbare methoden:

ArrayList resultaat = nieuwe ArrayList (); probeer (Scanner s = nieuwe scanner (nieuwe FileReader (bestandsnaam))) {while (s.hasNext ()) {result.add (s.nextInt ()); } resultaat teruggeven; }

5. Met behulp van Files.readAllLines

Waarschijnlijk de gemakkelijkste manier om een ​​bestand te lezen en al zijn regels in een ArrayList, is om de readAllLines () methode beschikbaar in Bestanden klasse:

Lijstresultaat = Files.readAllLines (Paths.get (bestandsnaam));

Deze methode kan ook een charset-parameter gebruiken om te lezen volgens een specifieke tekencodering:

Charset charset = Charset.forName ("ISO-8859-1"); Lijstresultaat = Files.readAllLines (Paths.get (bestandsnaam), karakterset);

6. Conclusie

Samenvattend hebben we enkele veelgebruikte manieren besproken om de inhoud van een het dossier in een ArrayList. We hebben ook enkele voor- en nadelen van de verschillende methoden besproken.

We kunnen bijvoorbeeld gebruiken BufferedReader om tekens te bufferen voor efficiëntie. Als alternatief kunnen we gebruiken Scanner om primitief te lezen met behulp van scheidingstekens. Of misschien kunnen we gewoon gebruiken Files.readAllLines (), zonder je zorgen te hoeven maken over de onderliggende implementatie.

Zoals gewoonlijk is de code beschikbaar in onze GitHub-repository.