Intenté usar java.io.FileReader para leer algunos archivos de texto y convertirlos en una cadena, pero encontré que el resultado está mal codificado y no se puede leer en absoluto.Problema de codificación Java FileReader
Aquí es mi medio ambiente:
Windows 2003, OS codificación: CP1252
Java 5,0
Mis archivos son codificación UTF-8 o CP1252 codificada, y algunos de ellos (archivos codificados en UTF-8) pueden contener caracteres chinos (no latinos).
uso el siguiente código para hacer mi trabajo:
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();
}
El código anterior no funciona. Encontré que la codificación del FileReader es CP1252, incluso si el texto está codificado en UTF-8. Pero el JavaDoc de java.io.FileReader dice que:
Los constructores de esta clase asumen que el carácter de codificación por defecto y el tamaño de memoria intermedia de bytes por defecto son apropiado.
¿Esto significa que no estoy obligado a establecer la codificación de caracteres por mí mismo si estoy utilizando FileReader? Pero obtuve datos codificados incorrectos actualmente, ¿cuál es la forma correcta de lidiar con mi situtaion? Gracias.
También debe perder String.valueOf() dentro del ciclo y usar StringBuffer.append (char [], int, int) directamente. Esto ahorra una gran cantidad de copia del char []. También reemplace StringBuffer con StringBuilder. Sin embargo, nada de esto tiene que ver con tu pregunta. –
Odio decirlo, pero ¿has leído el JavaDoc justo después de la parte que pegaste?Ya sabes, la parte que dice "Para especificar estos valores tú mismo, construye un InputStreamReader en un FileInputStream". – Powerlord
Gracias por su comentario, en realidad leo el JavaDoc, pero de lo que no estoy seguro es si debo especificar estos valores o no, y cambiar a "construir un InputStreamReader en un FileInputStream". – nybon