Я попытался использовать java.io.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? Но в настоящее время я получил неверно закодированные данные, как правильно поступить в моей ситуации? Спасибо.
Ответы:
Да, вам нужно указать кодировку файла, который вы хотите прочитать.
Да, это означает, что вы должны знать кодировку файла, который хотите прочитать.
Нет, не существует общего способа угадать кодировку любого заданного «текстового» файла.
Конструкторы с одним аргументом
FileReader
всегда используют кодировку платформы по умолчанию, что обычно является плохой идеей .Поскольку в Java 11
FileReader
появились конструкторы, принимающие кодировку:new FileReader(file, charset)
иnew FileReader(fileName, charset)
.В более ранних версиях java вам нужно использовать .
new InputStreamReader(
new FileInputStream(pathToFile)
, <encoding>)
источник
InputStreamReader
этоjava.io
класс, он будет «UTF8»?StandardCharsets.UTF_8
, там нет шанса опечатки ;-) Но да, если вы выберете строку"UTF8"
, будет правильно (хотя я, кажется, помню, что она принимает оба варианта).Byte Order Mark
, наряду с ... ну ... установлением порядка байтов! :) Поэтому мне кажется странным, что Java FileReader не может автоматически определять UTF-16 с такой спецификацией ... Фактически, я однажды написал a,UnicodeFileReader
который делает именно это. К сожалению, с закрытым исходным кодом, но у Google есть UnicodeReader, который очень похож.FileReader
использует кодировку платформы Java по умолчанию, которая зависит от системных настроек компьютера, на котором она работает, и обычно является самой популярной кодировкой среди пользователей в этой локали.Если это «лучшее предположение» неверно, вам необходимо явно указать кодировку. К сожалению,
FileReader
не позволяет этого (серьезная оплошность в API). Вместо этого вы должны использоватьnew InputStreamReader(new FileInputStream(filePath), encoding)
и, в идеале, получить кодировку из метаданных файла.источник
FileReader
использует кодировку по умолчанию для платформы Java, которая зависит от системных настроек компьютера, на котором она работает, и обычно является самой популярной кодировкой среди пользователей в этом регионе». Я бы так не сказал. По крайней мере винды. По некоторым странным техническим / историческим причинам JVM игнорирует тот факт, что Unicode является рекомендуемой кодировкой в Windows для «всех новых приложений», и вместо этого всегда действует так, как если бы устаревшая кодировка, настроенная как резерв для устаревших приложений , была «платформой по умолчанию».Начиная с Java 11 вы можете использовать это:
источник
Для Java 7+ документ вы можете использовать это:
Вот все кодировки doc
Например, если ваш файл находится в CP1252, используйте этот метод
Вот другие канонические имена для Java кодировок и для ввода - вывода и NIO документ
Если вы не знаете , с точно кодирующим у вас есть в файл, вы можете использовать некоторый сторонний LIBS как этот инструмент от Google это , который работает довольно аккуратно.
источник
FileInputStream с InputStreamReader лучше, чем напрямую с помощью FileReader, потому что последний не позволяет вам указывать кодировку кодировки.
Вот пример использования BufferedReader, FileInputStream и InputStreamReader вместе, чтобы вы могли читать строки из файла.
источник
Для других латинских языков, например кириллица, вы можете использовать что-то вроде этого:
и убедитесь, что ваш
.txt
файл сохраненUTF-8
вANSI
формате (но не по умолчанию ). Ура!источник