Čítanie textového súboru v jazyku Java

Zdá sa, že v Jave existujú rôzne spôsoby čítania a zápisu údajov súborov.

Chcem čítať údaje ASCII zo súboru. Aké sú možné spôsoby a ich rozdiely?

Môj obľúbený spôsob čítania malého súboru je použitie BufferedReader a StringBuilder. Je to veľmi jednoduché a účelné (aj keď nie príliš efektívne, ale pre väčšinu prípadov postačujúce):

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

Niektorí upozornili, že po Jave 7 by ste mali používať try-with-resources (t. j. funkcie automatického zatvárania):

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

Keď čítam takéto reťazce, zvyčajne chcem tak či tak vykonať nejaké spracovanie reťazca na riadok, takže potom volím túto implementáciu.

Hoci ak chcem skutočne len prečítať súbor do reťazca, vždy používam Apache Commons IO s metódou IOUtils.toString() triedy. Na zdrojový kód sa môžete pozrieť tu:

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

A v Jave 7 je to ešte jednoduchšie:

try(FileInputStream inputStream = new FileInputStream("foo.txt")) {       
    String everything = IOUtils.toString(inputStream);
    // do something with everything string
}
Komentáre (12)
Riešenie

ASCII je TEXTOVÝ súbor, takže na čítanie použijete Readers. Java podporuje aj čítanie z binárneho súboru pomocou InputStreams. Ak sú čítané súbory obrovské, potom by ste chceli použiť BufferedReader nad FileReader, aby ste zvýšili výkon čítania.

Prejdite si tento článok o tom, ako používať Reader

Tiež by som vám odporučil stiahnuť si a prečítať túto úžasnú (a pritom bezplatnú) knihu s názvom Thinking In Java.

V Jave 7:

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

(docs) alebo

Files.readAllLines(...)

(docs)

V Jave 8:

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

(docs)

Komentáre (8)

Najjednoduchším spôsobom je použitie triedy Scanner v jazyku Java a objektu FileReader. Jednoduchý príklad:

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

Scanner má niekoľko metód na čítanie reťazcov, čísel atď... Viac informácií o tom si môžete vyhľadať na stránke dokumentácie jazyka Java.

Napríklad čítanie celého obsahu do String:

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

Ak potrebujete špecifické kódovanie, môžete ho použiť namiesto FileReader:

new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)
Komentáre (5)