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