ler o arquivo completo sem usar loop em java


103

Possível duplicata:
como criar uma string Java a partir do conteúdo de um arquivo Arquivo de
texto inteiro para uma string em Java

Estou tentando ler o conteúdo de um arquivo usando o FileReader. Mas quero ler o arquivo sem ler linha por linha. É possível ler todo o arquivo sem loop. Estou usando o seguinte código

 try
 {
     File ff=new File("abc.txt");
     FileReader fr=new FileReader(ff);

     String s;
     while(br.read()!=-1)
     {
          s=br.readLine();
     }
 }

 catch(Exception ex)
 {
     ex.printStackTrace();
 }

Este código não compilará para começar.
Arya Pourtabatabaie

Há uma solução Java 11 de uma linha para isso: stackoverflow.com/a/52301018/942774
Hendrik

Respostas:


129

Se o arquivo for pequeno , você pode ler todos os dados uma vez:

File file = new File("a.txt");
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();

String str = new String(data, "UTF-8");

4
Não funciona para ativos Android de InputStream (sem comprimento)
akauppi

10
Quão pequeno é "pequeno"?
prata

8
@silver Todo o conteúdo do arquivo será armazenado na memória. Portanto, evite ler arquivos de 5 GB como este :-)
Thibaut D.

2
Nota: file.length()pode retornar 0 para arquivos abaixo de /proc. E, nesses casos, esse trecho retornará uma string vazia.
Mygod de

1
Também readpode não preencher todo o buffer. Pode funcionar na prática com a maioria dos JREs, mas não há garantia na API.
Daniel Lubarov

179

Solução Java 7 de uma linha

List<String> lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8);

ou

 String text = new String(Files.readAllBytes(Paths.get("file")), StandardCharsets.UTF_8);

1
Não é possível encontrar esses arquivos no Android.
akauppi

23
Nem todas as respostas do Java precisam ser adequadas ao Android, @akauppi! Basta procurar uma solução compatível com o Android a partir de outra resposta!
Isaac Woods

String text = Files.readString(Paths.get("file"));é ainda mais curto, supondo que você queira uma saída de string UTF-8.
Eagterrian Knight de

E se você já tem o objeto Arquivo, você pode fazer file.toPath()dentroreadAllBytes
Kartik Chugh

Importante para Android: Call requires API level 26: java.nio.file.Files#readAllBytes- mesma coisa para readString.
Neph

33

Você pode tentar usar o Scanner se estiver usando JDK5 ou superior.

Scanner scan = new Scanner(file);  
scan.useDelimiter("\\Z");  
String content = scan.next(); 

Ou você também pode usar goiaba

String data = Files.toString(new File("path.txt"), Charsets.UTF8);

4
Observe que o scanner deve ser fechado após o uso.
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. Apenas um pequeno erro de digitação. :-)
pisaruk

1
Este código Scannersó lê os primeiros 1024 bytes do arquivo. Observe o código-fonte. Ele lê o buffer e o verifica com este regexp. Isso sempre é válido - então ele retorna todo o conteúdo do buffer. Por padrão, o buffer tem tamanho de 1024 bytes.
Enyby

2
Esta é uma abordagem RUIM. A solução correta (para Java 1.7 e superior) é Files.readAllLines(). Para JREs legados, FileInputStream.read()é provavelmente o melhor. Não tenho certeza se ele é portátil para todas as plataformas (ou seja, Ctl-Z é reconhecido em todos os lugares), e é fácil deixar de fazer um Scanner.close().
paulsm4

33

Se você estiver usando Java 5/6, poderá usar o Apache Commons IO para ler arquivo em string. A classe org.apache.commons.io.FileUtilscontém vários métodos para ler arquivos.

por exemplo, usando o método FileUtils#readFileToString:

File file = new File("abc.txt");
String content = FileUtils.readFileToString(file);

1
Esta é provavelmente a solução mais fácil usando uma biblioteca de terceiros.
prata

3
Código mínimo para escrever; Muitas outras bibliotecas para adicionar ao projeto.
Please_Dont_Bully_Me_SO_Lords

2
O método readFileToString (File) do tipo FileUtils está obsoleto
JavaSheriff

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.