Leitura de um ficheiro de texto simples em Java

Parece que existem diferentes maneiras de ler e escrever dados de arquivos em Java.

Eu quero ler dados ASCII de um arquivo. Quais são as formas possíveis e suas diferenças?

Minha maneira favorita de ler um pequeno arquivo é usar um BufferedReader e um StringBuilder. É muito simples e directo (embora não seja particularmente eficaz, mas suficientemente bom para a maioria dos casos):

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

Alguns apontaram que depois do Java 7 você deve usar try-with-resources (i.e., fecho automático) características:

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

Quando eu leio cordas como esta, eu geralmente quero fazer algum manuseio de cordas por linha de qualquer maneira, então eu vou para esta implementação.

Embora se eu quiser realmente apenas ler um arquivo em uma String, eu sempre uso o Apache Commons IO com o método IOUtils.toString() da classe. Você pode dar uma olhada na fonte aqui:

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

E ainda mais simples com Java 7:

try(FileInputStream inputStream = new FileInputStream("foo.txt")) {       
    String everything = IOUtils.toString(inputStream);
    // do something with everything string
}
Comentários (12)
Solução

ASCII é um arquivo TEXT para que você utilize Readers para a leitura. Java também suporta a leitura de um arquivo binário utilizando InputStreams. Se os arquivos sendo lidos são enormes, então você gostaria de utilizar um BufferedReader em cima de um FileReader para melhorar a performance de leitura.

Aceda este artigo sobre como utilizar um 'Leitor'.

Eu também recomendo que você baixe e leia este livro maravilhoso (porém gratuito) chamado **Thinking In Java***

**Em Java 7***:

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

(docs) ou

Files.readAllLines(...)

8

**Em Java 8***:

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

9

Comentários (8)

A maneira mais fácil é utilizar a classe Scanner em Java e o objeto FileReader. Exemplo simples:

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

O "scanner" tem vários métodos de leitura em cordas, números, etc... Você pode procurar mais informações sobre isso na página de documentação Java.

Por exemplo, ler todo o conteúdo em um 'String':

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

Também se você precisar de uma codificação específica, você pode utilizá-la ao invés de FileReader:

new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)
Comentários (5)