Tavallisen tekstitiedoston lukeminen Javassa

Näyttää siltä, että on olemassa erilaisia tapoja lukea ja kirjoittaa tiedostojen tietoja Javassa.

Haluan lukea ASCII-dataa tiedostosta. Mitkä ovat mahdolliset tavat ja niiden erot?

Suosikkini pienten tiedostojen lukemiseen on käyttää BufferedReaderia ja StringBuilderia. Se on hyvin yksinkertaista ja yksinkertaista (joskaan ei erityisen tehokasta, mutta riittää hyvin useimpiin tapauksiin):

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();
}

Jotkut ovat huomauttaneet, että Java 7:n jälkeen pitäisi käyttää try-with-resources (eli automaattisen sulkemisen) ominaisuuksia:

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();
}

Kun luen tällaisia merkkijonoja, haluan yleensä joka tapauksessa tehdä jonkin verran merkkijonojen käsittelyä rivikohtaisesti, joten silloin käytän tätä toteutusta.

Tosin jos haluan vain lukea tiedoston merkkijonoksi, käytän aina Apachen Commons IO luokan IOUtils.toString()-metodia. Voit katsoa lähdettä täältä:

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();
}

Ja vielä yksinkertaisempaa Java 7:n kanssa:

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

ASCII on TEXT-tiedosto, joten lukemiseen käytetään Readers. Java tukee myös lukemista binääritiedostosta käyttämällä InputStreams. Jos luettavat tiedostot ovat valtavia, kannattaa käyttää BufferedReader FileReader:n lisäksi BufferedReader lukusuorituskyvyn parantamiseksi.

Tutustu tähän artikkeliin Reader:n käytöstä.

Suosittelen myös lataamaan ja lukemaan tämän ihanan (vieläpä ilmaisen) kirjan nimeltä Thinking In Java.

Javassa 7:

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

(docs) tai

Files.readAllLines(...)

(docs)

Javassa 8:

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

(docs)

Kommentit (8)

Helpoin tapa on käyttää Javan Scanner-luokkaa ja FileReader-objektia. Yksinkertainen esimerkki:

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

Scannerilla on useita metodeja merkkijonojen, numeroiden jne. lukemiseen... Voit etsiä lisätietoja tästä Javan dokumentointisivulta.

Esimerkiksi koko sisällön lukeminen String:iin:

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

Jos tarvitset tietyn koodauksen, voit käyttää tätä FileReader:n sijasta:

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