2009-03-30 11 views
108

Я попытался использовать 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? Но в настоящее время я получил неверные кодированные данные, каков правильный способ справиться с моей ситуацией? Благодарю.

+0

Вы также должны потерять String.valueOf() внутри цикла и напрямую использовать StringBuffer.append (char [], int, int). Это экономит много копий char []. Также замените StringBuffer на StringBuilder. Все это не о вашем вопросе ». –

+1

Ненавижу говорить об этом, но вы прочитали JavaDoc сразу после того, как вы вставили часть?Вы знаете, часть, в которой говорится: «Чтобы сами определить эти значения, создайте InputStreamReader в FileInputStream».? – Powerlord

+0

Спасибо за ваш комментарий, на самом деле я прочитал JavaDoc, но я не уверен, должен ли я сам определять эти значения и переключиться на «создание InputStreamReader в FileInputStream». – nybon

ответ

198

Да, вы должны указать код файла, который хотите прочитать.

Да, это означает, что вы должны указать код кодирования файла, который хотите прочитать.

Нет, нет общего способа для угадать кодировку любого данного файла «обычного текста».

The constructors of FileReader всегда использует стандартную кодировку платформы, которая обычно плохая идея.

Вместо FileReader вам необходимо использовать new InputStreamReader(new FileInputStream(pathToFile), <encoding>).

+1

InputStream is = new FileInputStream (имя файла); здесь я получил ошибку, не найденную ошибку с русским именем файла –

+2

+1 для предложения использования InputStreamReader, однако использование ссылок в блоках кода затрудняет копирование и вставку кода, если это можно изменить, thx – Ferrybig

+0

Будет ли это " UTF-8 "или" UTF8 "в кодировках. Согласно [ссылке Java SE по кодированию] (https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html), поскольку 'InputStreamReader' является' java.io 'class, это будет« UTF8 »? – NobleUplift

71

FileReader использует стандартную кодировку платформы Java, которая зависит от системных настроек компьютера, на котором он запущен, и, как правило, является самой популярной кодировкой среди пользователей в этой локали.

Если это «лучшее предположение» неверно, вы должны явно указать кодировку. К сожалению, FileReader не позволяет этого (большой надзор в API). Вместо этого вы должны использовать new InputStreamReader(new FileInputStream(filePath), encoding) и в идеале получить кодировку из метаданных о файле.

+17

«главный надзор в API» - спасибо за это объяснение - мне было интересно, почему я не смог найти конструктора, которым я был после! Cheers John – monojohnny

+0

@Bhanu Sharma: это проблема кодирования на другом уровне, проверьте, откуда вы берете имя файла, и если он жестко закодирован, что кодирует компилятор. –

+0

Я использую имя файла и hardcoded как строку, но ту же самую проблему я получаю, что я должен делать :( –

 Смежные вопросы

  • Нет связанных вопросов^_^