Я попытался использовать java.io.FileReader для чтения текстовых файлов и преобразования их в строку, но я обнаружил, что результат неверен и не читается вообще.Проблема с кодировкой Java FileReader
Вот моя среда:
Windows 2003, кодирование ОС: кодировка CP1252
Java 5,0
Мои файлы являются UTF-8 закодированы или кодировка CP1252 закодированы, и некоторые из они (кодированные файлы UTF-8) могут содержать китайские (не латинские) символы.
Я использую следующий код, чтобы сделать свою работу:
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();
}
Приведенный выше код не работает. Я обнаружил, что кодировка FileReader - это CP1252, даже если текст закодирован в кодировке UTF-8. Но JavaDoc из java.io.FileReader говорит, что:
Конструкторы этого класса предположит , что символ по умолчанию кодировка и размер байт буфера по умолчанию является необходимы.
Означает ли это, что мне не требуется устанавливать кодировку символов самостоятельно, если я использую FileReader? Но в настоящее время я получил неверные кодированные данные, каков правильный способ справиться с моей ситуацией? Благодарю.
Вы также должны потерять String.valueOf() внутри цикла и напрямую использовать StringBuffer.append (char [], int, int). Это экономит много копий char []. Также замените StringBuffer на StringBuilder. Все это не о вашем вопросе ». –
Ненавижу говорить об этом, но вы прочитали JavaDoc сразу после того, как вы вставили часть?Вы знаете, часть, в которой говорится: «Чтобы сами определить эти значения, создайте InputStreamReader в FileInputStream».? – Powerlord
Спасибо за ваш комментарий, на самом деле я прочитал JavaDoc, но я не уверен, должен ли я сам определять эти значения и переключиться на «создание InputStreamReader в FileInputStream». – nybon