- Двоичные данные:
byte, InputStream/OutputStream
; - Текст (Unicode):
String, char
(UTF-16 2 байта) , Reader/Writer
.
Это означает, что есть всегда должно быть преобразованием между ними, используя кодировку двоичных данных Charset.
Что раздражает:
InputStream.read()
возвращает значение типа int: a byte или -1 = конец файла.
Однобайтовые кодировки, как это происходит в Windows, имеют одинаковые первые 128 символов в чистом 7-битовом ASCII, StandardCharsets.US_ASCII
. Но они отличаются для оставшихся 128 байтов (греческий, русский, словакский, норвежский и так далее).
Java принял решение использовать Unicode для внутреннего использования, поэтому все сценарии могут быть объединены в одну строку.
Следовательно, всегда есть обращение. И строка никогда не должна использоваться для нетекстовых двоичных данных.