Зависит от формата файла, который вы читаете.
Если файл представляет собой поток байтов ASCII, сделайте следующее:
InputStream is = new FileInputStream( filePath );
Reader reader = new InputStreamReader( is, "ISO-8859-1" );
char ch = reader.read();
Вы всегда сначала открываете входной поток в файле, ориентированном на байты. Затем InputStreamReader преобразует байты в символы. Конечно, в этом случае ISO-8859-1 представляет собой сопоставление однобайтовых значений с точно такими же символьными значениями. Очевидно, что возможно и другое сопоставление, но ISO-8859-1 совпадает с первыми 255 символами набора Unicode, а первые 127 из них совпадают с ASCII.
При написании используйте:
OutputStream os = new FileOutputStream( filePath ) ;
Writer w = new OutputStreamWriter( os, "ISO-8859-1" );
w.write( ch );
Еще раз, это OutputStreamWriter, который соответствующим образом преобразует символы и поток байтов в соответствии с набором символов ISO-8859-1. Результирующий файл будет иметь один байт на символ.
Вот еще несколько примеров правильных базовых шаблонов потока.
Если вы используете вышеизложенное, вы выполняете это:
w.write("AAAA");
w.flush();
w.close();
Результирующий файл будет содержать 4 байта со значением 65 в каждом байте. Повторное чтение этого файла с использованием кода вверху приведет к четырем символам «A» в памяти, но в памяти они занимают 16 бит для каждого символа.
Если файл закодирован в другом наборе символов, включая, возможно, многобайтовые символы, просто используйте правильную кодировку в InputStreamReader/OutputStreamWriter, и правильное преобразование будет происходить при чтении и записи.
UTF-8 — это не набор символов, а скорее кодировка обычных символов Юникода в последовательности байтов, и оказывается, что кодировка UTF-8 довольно умна, поскольку первые 127 символов символов Юникода отображаются в первые 127 символов. байтовые значения (как отдельные байты сами по себе). Затем символы> = 128 используют 2 или более байтовых значения в строке, где каждое из этих байтовых значений> = 128. Если вы знаете, что файл ascii использует только «7-битный» ASCII, тогда UTF-8 будет работать для вас также. Для Java в целом UTF-8 является лучшей кодировкой для использования в файле, поскольку она может правильно кодировать все возможные значения символов Java без потерь.
Изучение этого о потоках очень важно. Я рекомендую вам не пытаться конвертировать байты в символы каким-либо другим способом. Можно, конечно, но это пустая трата сил, так как преобразования в потоках очень надежны и корректны.
(Бывает еще хуже... на самом деле Символ - это 32-битная величина, из которых 20 бит могут быть закодированы в последовательности 16-битных значений char с кодировкой, называемой UTF-16. Рекомендуем пока игнорировать это, но просто будьте известно, что даже в строке Java, которая состоит из 16-битных значений символов, есть некоторые последовательности с двойными символами.)
person
AgilePro
schedule
02.01.2014
char
является 16-битным типом данных. Он не хранит символ; Он хранит кодовую единицу UTF-16. Ровно одна или две кодовые единицы UTF-16 составляют кодовую точку UTF-16. Кодовая точка идентифицирует конкретный символ Unicode. Кроме того, вы смотрите на неправильный набор символов. Java обычно использует Unicode, хотя некоторые потоковые классы по умолчанию используют набор символов ОС по умолчанию. - person Tom Blodget   schedule 02.01.2014