2009-03-30 4 views
108

Ho provato a utilizzare java.io.FileReader per leggere alcuni file di testo e convertirli in una stringa, ma ho trovato il risultato codificato errato e non leggibile.Problema di codifica Java FileReader

Ecco il mio ambiente:

  • Windows 2003, sistema operativo di codifica: CP1252

  • Java 5,0

I miei file sono codifica UTF-8 o CP1252 codificato, e alcuni dei loro (file codificati UTF-8) possono contenere caratteri cinesi (non latini).

Io uso il seguente codice per fare il mio lavoro:

private static String readFileAsString(String filePath) 
    throws java.io.IOException{ 
     StringBuffer fileData = new StringBuffer(1000); 
     FileReader reader = new FileReader(filePath); 
     //System.out.println(reader.getEncoding()); 
     BufferedReader reader = new BufferedReader(reader); 
     char[] buf = new char[1024]; 
     int numRead=0; 
     while((numRead=reader.read(buf)) != -1){ 
      String readData = String.valueOf(buf, 0, numRead); 
      fileData.append(readData); 
      buf = new char[1024]; 
     } 
     reader.close(); 
     return fileData.toString(); 
    } 

Il codice di cui sopra non funziona. Ho trovato che la codifica di FileReader è CP1252 anche se il testo è codificato in UTF-8. Ma la JavaDoc di java.io.FileReader dice che:

I costruttori di questa classe assumono che il carattere di default codifica e la dimensione in byte-buffer di default sono appropriate.

Ciò significa che non è necessario impostare la codifica dei caratteri da solo se utilizzo FileReader? Ma al momento ho ricevuto dati codificati errati, qual è il modo corretto di gestire il mio situtaion? Grazie.

+0

Si dovrebbe anche perdere String.valueOf() all'interno del ciclo e usare StringBuffer.append (char [], int, int) direttamente. Ciò consente di risparmiare un sacco di copie del carattere []. Sostituisci anche StringBuffer con StringBuilder. Niente di tutto questo riguarda la tua domanda, 'comunque. –

+1

Odio dirlo, ma hai letto JavaDoc subito dopo la parte che hai incollato?Sai, la parte che dice "Per specificare tu stesso questi valori, costruisci un InputStreamReader su un FileInputStream."? – Powerlord

+0

Grazie per il tuo commento, in realtà ho letto il JavaDoc, ma quello che non sono sicuro è se dovrei specificare questi valori da solo e passare a "costruire un InputStreamReader su un FileInputStream". – nybon

risposta

198

Sì, è necessario specificare la codifica del file che si desidera leggere.

Sì, questo significa che è necessario conoscere la codifica del file che si desidera leggere.

No, non esiste un modo generale per indovinare la codifica di un determinato file di "testo normale".

The constructors of FileReader utilizzare sempre la codifica di default della piattaforma che è generalmente una cattiva idea.

Invece di FileReader è necessario utilizzare new InputStreamReader(, <encoding>).

+1

InputStream è = new FileInputStream (nome file); qui ho errore errore file non trovato con il nome di file russo –

+2

+1 per il suggerimento di utilizzare InputStreamReader, tuttavia utilizzando i collegamenti in blocchi di codice rende difficile copiare e incollare il codice, se questo può essere modificato, thx – Ferrybig

+0

Sarebbe essere " UTF-8 "o" UTF8 "nelle codifiche. Secondo [il riferimento Java SE sulla codifica] (https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html), dal momento che 'InputStreamReader' è un' java.io 'classe, sarebbe" UTF8 "? – NobleUplift

71

FileReader utilizza la codifica predefinita della piattaforma Java, che dipende dalle impostazioni di sistema del computer su cui è in esecuzione ed è generalmente la codifica più popolare tra gli utenti in quella locale.

Se questa "ipotesi migliore" non è corretta, è necessario specificare la codifica in modo esplicito. Sfortunatamente, FileReader non consente questo (maggiore controllo dell'API). Invece, è necessario utilizzare new InputStreamReader(new FileInputStream(filePath), encoding) e idealmente ottenere la codifica dai metadati relativi al file.

+17

"supervisione principale dell'API" - grazie per questa spiegazione - mi chiedevo perché non riuscivo a trovare il costruttore che cercavo! Cheers John – monojohnny

+0

@Bhanu Sharma: si tratta di un problema di codifica a un livello diverso, controlla da dove viene visualizzato il nome del file e se è codificato in modo rigido quale codifica viene utilizzata dal compilatore. –

+0

uso sia il nome del file sia hardcoded come stringa ma lo stesso errore ottengo cosa devo fare :( –