leggere il file completo senza utilizzare il ciclo in java


103

Possibile duplicato:
come creare una stringa Java dal contenuto di un file
File di testo intero a una stringa in Java

Sto cercando di leggere il contenuto di un file utilizzando FileReader. Ma voglio leggere il file senza leggere riga per riga. È possibile leggere l'intero file senza loop. Sto usando il seguente codice

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

Questo codice non verrà compilato per cominciare.
Arya Pourtabatabaie

Esiste una soluzione Java 11 a una riga per questo: stackoverflow.com/a/52301018/942774
Hendrik

Risposte:


129

Se il file è piccolo , puoi leggere tutti i dati una volta:

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
Non funziona per le risorse Android di InputStream (senza lunghezza)
akauppi

10
Quanto è piccolo "piccolo"?
argento

8
@silver L'intero contenuto del file verrà archiviato in memoria. Quindi, evita di leggere file da 5 GB come questo :-)
Thibaut D.

2
Nota: file.length()può restituire 0 per i file sotto /proc. E in quei casi questo frammento restituirà una stringa vuota.
Mygod

1
Inoltre readpotrebbe non riempire l'intero buffer. Potrebbe funzionare in pratica con la maggior parte dei JRE, ma non c'è alcuna garanzia nell'API.
Daniel Lubarov

179

Soluzione in una riga Java 7

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

o

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

1
Non riesco a trovare quei file in Android.
akauppi

23
Non tutte le risposte Java devono essere adatte ad Android, @akauppi! Cerca una soluzione supportata da Android da un'altra risposta!
Isaac Woods

String text = Files.readString(Paths.get("file"));è ancora più breve, supponendo che si desideri un output di stringa UTF-8.
Eagterrian Knight

E se hai già l'oggetto File, puoi farlo file.toPath()all'internoreadAllBytes
Kartik Chugh

Importante per Android: Call requires API level 26: java.nio.file.Files#readAllBytes- stessa cosa per readString.
Neph

33

Puoi provare a utilizzare Scanner se stai usando JDK5 o versioni successive.

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

Oppure puoi anche usare Guava

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

4
Notare che lo scanner deve essere chiuso dopo l'uso.
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. Solo un piccolo errore di battitura. :-)
pisaruk

1
Questo codice ha Scannerletto solo i primi 1024 byte dal file. Guarda il codice sorgente. Legge il buffer e lo controlla con questa regexp. Questo è sempre valido, quindi restituisce tutto il contenuto del buffer. Per impostazione predefinita, il buffer ha una dimensione di 1024 byte.
Enyby

2
Questo è un approccio BAD. La soluzione corretta (per Java 1.7 e versioni successive) è Files.readAllLines(). Per i JRE legacy, FileInputStream.read()è probabilmente il migliore. Non sono sicuro che sia portabile su tutte le piattaforme (cioè Ctl-Z è riconosciuto ovunque), ed è facile non riuscire a fare un file Scanner.close().
paulsm4

33

Se stai usando Java 5/6, puoi usare Apache Commons IO per leggere il file in stringa. La classe org.apache.commons.io.FileUtilscontiene diversi metodi per leggere i file.

ad esempio utilizzando il metodo FileUtils#readFileToString:

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

1
Questa è probabilmente la soluzione più semplice utilizzando una libreria di terze parti.
argento

3
Codice minimo da scrivere; Molte altre librerie da aggiungere al progetto.
Please_Dont_Bully_Me_SO_Lords

2
Il metodo readFileToString (File) del tipo FileUtils è deprecato
JavaSheriff

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.