Lezen van een tekstbestand in Java

Het lijkt erop dat er verschillende manieren zijn om gegevens van bestanden in Java te lezen en te schrijven.

Ik wil ASCII data uit een bestand lezen. Wat zijn de mogelijke manieren en hun verschillen?

Mijn favoriete manier om een klein bestand te lezen is het gebruik van een BufferedReader en een StringBuilder. Het is heel eenvoudig en to the point (hoewel niet bijzonder effectief, maar goed genoeg voor de meeste gevallen):

BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
    }
    String everything = sb.toString();
} finally {
    br.close();
}

Sommigen hebben erop gewezen dat je na Java 7 try-with-resources moet gebruiken. (d.w.z. auto close) functies:

try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
    }
    String everything = sb.toString();
}

Als ik dit soort strings lees, wil ik meestal toch al wat string handling per regel doen, dus dan ga ik voor deze implementatie.

Hoewel, als ik eigenlijk alleen maar een bestand in een String wil lezen, gebruik ik altijd Apache Commons IO met de klasse IOUtils.toString() methode. Je kunt de broncode hier bekijken:

http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html

FileInputStream inputStream = new FileInputStream("foo.txt");
try {
    String everything = IOUtils.toString(inputStream);
} finally {
    inputStream.close();
}

En nog eenvoudiger met Java 7:

try(FileInputStream inputStream = new FileInputStream("foo.txt")) {       
    String everything = IOUtils.toString(inputStream);
    // do something with everything string
}
Commentaren (12)
Oplossing

ASCII is een TEKST bestand, dus je zou Readers gebruiken voor het lezen. Java ondersteunt ook het lezen uit een binair bestand met InputStreams. Als de bestanden die gelezen moeten worden groot zijn, dan zou je een BufferedReader willen gebruiken bovenop een FileReader om de leesprestaties te verbeteren.

Lees dit artikel over hoe je een Reader kunt gebruiken

Ik'zou je ook aanraden om dit prachtige (maar gratis) boek genaamd Thinking In Java te downloaden en te lezen.

In Java 7]6:

new String(Files.readAllBytes(...))

(docs) of

Files.readAllLines(...)

(docs)

In Java 8:

Files.lines(..).forEach(...)

(docs)

Commentaren (8)

De eenvoudigste manier is gebruik te maken van de Scanner klasse in Java en het FileReader object. Simpel voorbeeld:

Scanner in = new Scanner(new FileReader("filename.txt"));

Scanner heeft verschillende methodes voor het inlezen van strings, getallen, enz... Meer informatie hierover kun je vinden op de Java documentatie pagina.

Bijvoorbeeld het inlezen van de hele inhoud in een String:

StringBuilder sb = new StringBuilder();
while(in.hasNext()) {
    sb.append(in.next());
}
in.close();
outString = sb.toString();

Ook als je een specifieke encoding nodig hebt kun je dit gebruiken in plaats van FileReader:

new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)
Commentaren (5)