Arquivo de texto de leitura de linha única com Java

tl; dr

String fileContents = new Scanner(new File("path/to/file")).useDelimiter("\Z").next()

O verdadeiro negócio

A API Java IO é muito boa, permitindo-nos ler toneladas de fluxos diferentes de maneiras diferentes, com suas interfaces genéricas e decoradores.

Mas às vezes você só quer fazer coisas simples, e esses padrões legais ficam lá apenas para bagunçar seu código. Tome como exemplo o esforço para ler um arquivo de texto simples:

String line = "", fileContents = "";
StringBuffer buffer = new StringBuffer();

try {
BufferedReader br = new BufferedReader(new FileReader("/path/to/file"));
while ((line = br.readLine()) != null) {
fileContents
.append(thisLine);
}
} catch (IOException e) {
System.err.println("Error: " + e);
}

fileContents
= buffer.toString();

sim

File.read('/path/to/file')

e tudo feito?

Existe uma maneira melhor. E o melhor: está bem ali na API Java STD : uma classe sofisticada chamada Scanner , que abstrai algumas partes desagradáveis ​​dos fluxos de leitura. Seu construtor recebe qualquer fonte de entrada (como um InputStream ou File), permitindo que você encapsule qualquer tipo de stream com o qual você costuma lidar.

O Scanner facilita a leitura de streams em tokens (útil para arquivos do tipo CSV) e ainda fornece conveniências como a conversão de dados em inteiros ao ler de stream.
2
Por padrão, o delimitador de token usado pelo scanner é o ‘ n’ (alimentação de linha), mas você pode definir qualquer caractere que desejar. O método next () permite que você recupere o próximo token, com base neste delimitador. Mas e se você definir o delimitador como EOF ? Este truque desagradável funciona e é muito simples:

String fileContents = new Scanner(new File("path/to/file")).useDelimiter("\Z").next()

O ” Z” aqui resolve o problema. Como os tokens terminam em EOF, uma única chamada para next trará a você todo o conteúdo do arquivo.

Confira os documentos para obter métodos mais convenientes:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html