Qual è il modo più semplice per leggere un file in String?

Sto cercando di leggere un semplice file di testo in una stringa. Ovviamente c’è il solito modo di ottenere il stream di input e iterare con readLine () e leggere i contenuti in String.

Avendolo fatto centinaia di volte in passato, mi sono semplicemente chiesto come posso farlo in linee minime di codice? Non c’è qualcosa in java come String fileContents = XXX.readFile(myFile/*File*/) .. piuttosto qualcosa che sembra semplice come questo?

So che ci sono biblioteche come Apache Commons IO che forniscono tali semplificazioni o anche io posso scrivere una semplice class Util per fare questo. Ma tutto ciò che mi chiedo è – questa è un’operazione così frequente che tutti hanno bisogno di allora, perché Java non fornisce una funzione così semplice? Non c’è davvero un solo metodo da qualche parte per leggere un file in una stringa con qualche codifica predefinita o specificata?

Sì, puoi farlo in una riga (sebbene per una solida gestione IOException non vorresti farlo).

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

Questo usa java.util.Scanner , dicendogli di delimitare l’input con \Z , che è la fine dell’ancora della stringa. Questo in definitiva rende l’input un token effettivo, che è l’intero file, quindi può essere letto con una chiamata a next() .

Esiste un costruttore che accetta un File e un nome di String charSetName (tra molti altri overload). Questi due costruttori possono lanciare FileNotFoundException , ma come tutti i metodi Scanner , nessuna IOException può essere lanciata al di là di questi costruttori.

È ansible interrogare lo Scanner stesso tramite il metodo ioException() se si IOException verificata o meno una ioException() IOException . Si consiglia inoltre di close() esplicitamente close() lo Scanner dopo aver letto il contenuto, quindi è preferibile memorizzare il riferimento dello Scanner in una variabile locale.

Guarda anche

  • Esercitazioni su Java – I / O Essentials – Scansione e formattazione

Domande correlate

  • Convalida dell’input utilizzando java.util.Scanner – ha molti esempi di utilizzo più tipico

Opzioni di libreria di terze parti

Per completezza, queste sono davvero delle buone opzioni se hai queste librerie di terze parti molto affidabili e molto utili:

Guaiava

com.google.common.io.Files contiene molti metodi utili. Quelli pertinenti qui sono:

  • String toString(File, Charset)
    • Usando il set di caratteri specificato, legge tutti i caratteri da un file in una String
  • List readLines(File, Charset)
    • … legge tutte le righe da un file in un List , una voce per riga

Apache Commons / IO

org.apache.commons.io.IOUtils offre anche funzionalità simili:

  • String toString(InputStream, String encoding)
    • Utilizzando la codifica dei caratteri specificata, ottiene il contenuto di un InputStream come una String
  • List readLines(InputStream, String encoding)
    • … come un (grezzo) List di String , una voce per riga

Domande correlate

  • Più utili librerie Java gratuite di terze parti (cancellate)?

Da Java 7 (Descrizione API) in poi puoi fare:

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

Dove filePath è una stringa che rappresenta il file che si desidera caricare.

È ansible utilizzare i commons di apache IO ..

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

Questo dovrebbe funzionare per te:

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

Utilizzando Apache Commons IO .

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

Puoi vedere de javadoc per il metodo per i dettagli.

Non scrivere la tua class util per farlo, ti consiglio di usare Guava , che è pieno di tutti i tipi di bontà. In questo caso vorrai sia la class Files (se stai davvero leggendo un file) che i CharStreams per una lettura più generica. Ha metodi per leggere i dati in una lista di stringhe ( readLines ) o totalmente ( toString ).

Ha metodi utili simili anche per i dati binari. E poi c’è il resto della biblioteca …

Sono d’accordo che è fastidioso che non ci sia nulla di simile nelle librerie standard. Diamine, solo essere in grado di fornire un CharSet a un FileReader renderebbe la vita un po ‘ più semplice …

Un altro approccio alternativo è:

Come posso creare una stringa Java dal contenuto di un file?

Un’altra opzione è quella di utilizzare le utilità librerie open source fornite
http://commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html

Perché java non fornisce un’API di utilizzo comune?
a) per mantenere le API generiche in modo che la codifica, il buffering ecc. sia gestito dal programmatore.
b) fare in modo che i programmatori facciano del lavoro e scrivano / condividano le librerie di open source: D 😉

Purtroppo no.

Sono d’accordo sul fatto che un’operazione così frequente dovrebbe avere un’implementazione più semplice della copia di input riga per riga in loop, ma dovrai scrivere il metodo helper o usare la libreria esterna.

Ho scoperto che la risposta accettata in realtà non funziona sempre, perché \\Z potrebbe verificarsi nel file. Un altro problema è che se non si ha il set di caratteri corretto può accadere un sacco di cose inaspettate che possono causare la lettura da parte dello scanner solo di una parte del file.

La soluzione è usare un delimitatore che si è certi non si verificherà mai nel file. Tuttavia, questo è teoricamente imansible. Quello che possiamo fare, è usare un delimitatore che ha una così piccola possibilità di verificarsi nel file che è trascurabile: tale delimitatore è un UUID , che è supportato nativamente in Java.

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

di seguito è riportato il semplice codice per leggere il contenuto del file nella stringa

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