2017-02-09 1 views
1

У меня есть файл с китайскими символами. Я написал код Java, который читает этот файл и записывает его в другой файл, используя FileInputStream/FileOutputStream (Byte Stream), и он работает нормально. Но проблема возникает, когда я использую поток символов FileReader/FileWriter.Чтение/запись символов FileReader и FileWriter не умеют читать/писать китайский файл, но байт Reader/Writer работает нормально

Теперь вопрос заключается в том, что поток байтов, который использует только восемь бит, способен читать китайские символы, потому что то, что я знаю, это то, что поток байтов считывает/записывает один байт за один раз и использует один байт, мы можем распознавать только ASCII символов (т.е. всего 128 символов). Поток символов (FileReader/FileWriter), который использует 16 бит для чтения/записи и имеет возможность читать/писать китайский символ, не способен правильно читать/записывать файл.

+0

вы должны показать нам свой код, * но * обратите внимание, что 'FileInputStream' не волнует, что ваш файл хранит, он копирует исходные байты; когда вы открываете файл, который он скопировал на инструмент, который вы используете (скажем, блокнот), применяет кодировку, которая преобразует эти байты в текст, читаемый человеком. – Eugene

+0

@ Юджин Хорошо. Предположим теперь, что каждый китайский символ хранится как два байта в файле, а чтение/запись байтового потока читает и записывает один байт за один раз в другой файл, и, наконец, инструмент (блокнот ++) преобразует его в удобочитаемую форму (т.е. объединить два байта, чтобы сформировать китайский символ). Но в чем проблема в потоке символов, это также чтение и запись двух байтов за один раз, и инструмент (блокнот ++) должен преобразовать его в читаемую человеком форму. –

+0

не обязательно два байта, это может быть больше; например, суррогатные пары. Также почти наверняка вы ошиблись в кодировке, см. Здесь для подсказки: http://stackoverflow.com/questions/13350676/how-to-read-write-this-in-utf-8 – Eugene

ответ

1

Кодировка символов (или декодирование) применяется только тогда, когда вы пытаетесь преобразовать потоки байтов в строку (или символ). FileInputStream и FileOutputStream будут работать с любыми символами, поскольку они не являются символом, а байтами.

При попытке прочитать файл как символ, используя FileReader и FileWriter, вы должны учитывать кодировку символов. Посмотрите на следующие java-документы от FileReader,

Класс удобства для чтения файлов символов. Конструкторы этого класса предполагают, что подходят кодировка символов по умолчанию и размер байта-байта по умолчанию . Чтобы сами определить эти значения, создайте InputStreamReader в FileInputStream.

Теперь, если вы используете FileReader (аналогично FileWriter), он выберет кодировку по умолчанию из системы, на которой она запущена (на основе локали), особенно в ОС Windows. Вы могли бы,

  1. В частности передать параметр file.encoding как "UTF-8"
  2. Построить свой собственный InputStream с продходящим.

Надеется, что это помогает

+1

Чтобы подчеркнуть, если вы делают обработку текста, не используют FileInputStream (если вам не нужно избегать классов обработки текста Java). –