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.
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. –
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
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