Здесь важно понять концепцию кодирования.
String
/ char[]
/ Writer
/ Reader
используются для работы с текстовыми данными любого вида.
byte[]
/ OutputStream
/ InputStream
используются для работы с двоичными данными.Кроме того, файл на вашем диске только каждый хранит двоичные данные (да, это правда, мы надеемся, что через минуту он станет немного более понятным).
Всякий раз, когда вы конвертируете между этими двумя мирами, будет использоваться какая-то кодировкав игре.В Java существует несколько способов преобразования между этими мирами без указания кодировки .В этом случае будет использоваться кодировка платформы по умолчанию (которая зависит от вашей платформы и конфигурации / локали).[*]
Задача кодирования - преобразовать некоторые заданные двоичные данные (обычно из byte[]
/ ByteBuffer
/ InputStream
) в текстовые данные (обычно в char[]
/ CharBuffer
/ Writer
) или наоборот .
Как именно это происходит, зависит от используемой кодировки.Некоторые кодировки (такие как семейство ISO-8859- *) представляют собой простое сопоставление значений byte
с соответствующими кодовыми точками Unicode, другие (такие как UTF-8) являются более сложными, и одна кодовая точка Unicode может быть любой от 1 до 4байт.
Есть довольно хорошая статья, которая дает общий обзор всей проблемы кодирования, озаглавленной: Абсолютный минимум, который должен знать каждый разработчик программного обеспечения о Unicode и наборах символов (никаких оправданий!)
[*] Использование кодировки по умолчанию на платформе обычно нежелательно, поскольку она делает вашу программу непереносимой и трудной в использовании, но это не относится к этому посту.