Qual é a maneira mais simples de ler um arquivo no String?

Eu estou tentando ler um arquivo de texto simples em uma String. É claro que há a maneira usual de obter o stream de input e iterar com o readLine () e ler o conteúdo em String.

Tendo feito isso centenas de vezes no passado, eu só queria saber como posso fazer isso em linhas mínimas de código? Não há algo em java como String fileContents = XXX.readFile(myFile/*File*/) .. em vez disso tudo o que parece tão simples como isso?

Eu sei que existem bibliotecas como o Apache Commons IO que fornecem tais simplificações ou até mesmo eu posso escrever uma simples class Util para fazer isso. Mas tudo o que eu imagino é – esta é uma operação tão frequente que todo mundo precisa, então por que o Java não fornece uma function tão simples? Existe realmente um único método em algum lugar para ler um arquivo em string com alguma codificação padrão ou especificada?

Sim, você pode fazer isso em uma linha (embora para manipulação robusta de IOException você não queira).

 String content = new Scanner(new File("filename")).useDelimiter("\\Z").next(); System.out.println(content); 

Isso usa um java.util.Scanner , dizendo para delimitar a input com \Z , que é o fim da âncora da cadeia. Isso faz com que a input tenha um token real, que é o arquivo inteiro, para que possa ser lido com uma chamada para next() .

Existe um construtor que leva um File e um String charSetName (entre muitas outras sobrecargas). Esses dois construtores podem lançar FileNotFoundException , mas como todos os methods do Scanner , nenhuma IOException pode ser lançada além desses construtores.

Você pode consultar o próprio Scanner através do método ioException() se uma IOException ocorrer ou não. Você também pode querer explicitamente close() o Scanner depois de ler o conteúdo, portanto, talvez o melhor seja armazenar a referência do Scanner em uma variável local.

Veja também

  • Tutoriais Java – I / O Essentials – Digitalização e formatação

Perguntas relacionadas

  • Validando input usando java.util.Scanner – tem muitos exemplos de uso mais típico

Opções de biblioteca de terceiros

Para completar, essas são algumas opções muito boas se você tiver essas bibliotecas de terceiros muito confiáveis ​​e úteis:

Goiaba

com.google.common.io.Files contém muitos methods úteis. Os pertinentes aqui são:

  • String toString(File, Charset)
    • Usando o conjunto de caracteres fornecido, lê todos os caracteres de um arquivo em uma String
  • List readLines(File, Charset)
    • … lê todas as linhas de um arquivo em uma List , uma input por linha

Apache Commons / IO

org.apache.commons.io.IOUtils também oferecem funcionalidade semelhante:

  • String toString(InputStream, String encoding)
    • Usando a codificação de caractere especificada, obtém o conteúdo de um InputStream como uma String
  • List readLines(InputStream, String encoding)
    • … como uma lista (Raw) de String , uma input por linha

Perguntas relacionadas

  • A maioria das bibliotecas Java gratuitas de terceiros (excluídas)?

A partir do Java 7 (Descrição da API) , você pode fazer:

new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);

Onde filePath é uma String representando o arquivo que você deseja carregar.

Você pode usar o apache commons IO ..

 FileInputStream fisTargetFile = new FileInputStream(new File("test.txt")); String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8"); 

Isso deve funcionar para você:

 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; public static void main(String[] args) throws IOException { String content = new String(Files.readAllBytes(Paths.get("abc.java"))); } 

Usando o Apache Commons IO .

 import org.apache.commons.io.FileUtils; //... String contents = FileUtils.readFileToString(new File("/path/to/the/file"), "UTF-8") 

Você pode ver o javadoc para o método para detalhes.

Não escreva sua própria class de utilitários para fazer isso – eu recomendaria usar Goiaba , que é cheia de todos os tipos de bondade. Neste caso, você quer a class Files (se você está apenas lendo um arquivo) ou o CharStreams para leitura de propósito geral. Possui methods para ler os dados em uma lista de strings ( readLines ) ou totalmente ( toString ).

Tem methods úteis semelhantes para dados binários também. E depois há o resto da biblioteca …

Eu concordo que é irritante que não haja nada semelhante nas bibliotecas padrão. Heck, apenas ser capaz de fornecer um CharSet para um FileReader tornaria a vida um pouco mais simples …

Outra abordagem alternativa é:

Como faço para criar uma string Java a partir do conteúdo de um arquivo?

Outra opção é usar utilitários fornecidos bibliotecas de código aberto
http://commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html

Por que o java não fornece uma API de utilitários tão comum?
a) manter as APIs genéricas, de modo que a codificação, o armazenamento em buffer, etc., seja tratado pelo programador.
b) fazer programadores fazer algum trabalho e escrever / compartilhar bibliotecas utilitárias opensource: D 😉

Infelizmente não.

Concordo que essa operação freqüente deve ter uma implementação mais fácil do que a cópia da linha de input em loop, mas você terá que escrever o método auxiliar ou usar a biblioteca externa.

Descobri que a resposta aceita nem sempre funciona, porque \\Z pode ocorrer no arquivo. Outro problema é que, se você não tiver o conjunto de caracteres correto, pode acontecer um monte de coisas inesperadas que podem fazer com que o scanner leia apenas uma parte do arquivo.

A solução é usar um delimitador que você está certo de que nunca ocorrerá no arquivo. No entanto, isso é teoricamente impossível. O que PODEMOS fazer é usar um delimitador que tenha uma chance tão pequena de ocorrer no arquivo que seja insignificante: tal delimitador é um UUID , que é suportado nativamente em Java.

 String content = new Scanner(file, "UTF-8") .useDelimiter(UUID.randomUUID().toString()).next(); 

abaixo está o código simples para ler o conteúdo do arquivo em string

  try { String line; File file = new File("C:/LEO/abc.txt"); FileReader fr = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fr); HashMap< String, Integer> objHashMap = new HashMap<>(); while((line = bufferedReader.readLine()) != null) { String lineWords[] = line.split(" "); for(String singleWord:lineWords) { System.out.println(singleWord); } } for(String keyObject:objHashMap.keySet()) { System.out.println(keyObject + ": " + objHashMap.get(keyObject)); } } catch(Exception exception) { System.out.println("IOException occured"); exception.printStackTrace(); }