В зависимости от формата файла, который вы читаете.
Если файл представляет собой поток 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 набор символов. Результирующий файл будет иметь один байт на символ.
Вот еще несколько примеров из proper basic stream patterns.
При использовании выше, вы выполнить это:
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 char.
Узнав об этом в потоках очень важно. Я рекомендую вам не пытаться преобразовывать байты в символы любым другим способом. Конечно, это возможно, но это пустая трата усилий, поскольку конверсии в потоках очень надежны и правильны.
(Ухудшается ... на самом деле символ - это 32-битное количество, из которых 20 бит могут быть закодированы в последовательности 16-разрядных значений char с кодировкой UTF-16. Рекомендуем вам игнорировать это на данный момент , но просто имейте в виду, что даже в Java String, состоящем из 16-битных значений char, есть несколько последовательностей с двумя символами.)
символьные потоки сделки с символами, а не байт. Говорить, что символьные потоки «чтение байта в байт» неточно. – davmac
'char' _is_ - 16-разрядный тип данных. Он не хранит символ; Он хранит код UTF-16. Точно один или два кодовых блока UTF-16 содержат кодовую точку UTF-16. Кодовое обозначение обозначает конкретный символ Юникода. Кроме того, вы смотрите на неправильный набор символов. Java обычно использует [Unicode] (http://en.wikipedia.org/wiki/Unicode#Unicode_in_use), хотя некоторые классы потоков по умолчанию используют набор символов по умолчанию для ОС. –