2014-01-21 5 views
0

У меня есть несколько вопросов, связанных с тем, что такое потоки байтов, как они работают .... Если у вас есть дружественные для новорожденных ссылки, это будет лучше.Байт-потоки и связанные с ними вещи

1) Когда я сохраняю поток байтов в некоторый txt (например, метод writeInt), я получаю символы тарабарщины. Откуда они? Текстовый редактор пытается декодировать байты, но почему безуспешно? В то же время класс writeBytes() от DataOutputStream также записывает строки как последовательность байтов, но на этот раз он отображается как символы в текстовом редакторе. Зачем?

2) Какой фильтр DataOutputStream используется, что он добавляет? Говорят, что DataOutputStream включает в себя различные типы (int, double ...), которые должны быть записаны непосредственно из потока. Что это значит?

4) Если у меня есть 2 docx 1000 символов каждый, в первом используются английские символы, 2-й, например, Русские символы. Должен ли русский документ быть больше (так как я понимаю, что все эти странные буквы могут занимать более 1 байт). Но похоже, что это не так.

5) В чем разница между байтовыми и символьными потоками с точки зрения реализации - как сохранить последовательность байтов, а потоки символов делить его на куски? Как это делается?

Спасибо!

+1

1.) Приведите пример 2.) прочитайте документ 3.) что вы ожидали 4.) Читайте о кодировке символов 5.) Снова прочитайте о кодировании. – Ingo

+1

4) Все символы в Java представлены как 16 бит или 2 байта. – Yevhen

+0

откуда вы получаете байтовый поток? вы получаете от сети? –

ответ

5

Java проводит концептуальное различие между:

  • двоичных данных: byte[], InputStream, OutputStream
  • Текст (Unicode): String, char, Reader, Writer
  • мост между ними: InputStreamReader, OutputStreamWriter, String.getBytes(charset), new String(bytes, charset)

INT состоит из 4 байтов , например 0, 0, 2, 12 для 2 * 256 + 12 = 524. В файле эти байты не распознаются. текстовое представление Integer.toString(524) = «524» в ASCII или почти любой набор символов будет как:

byte[] bytes = "542".getBytes("UTF-8"); // Three bytes: 53, 50, 52 

DataOutputStream специальная (двоичные данные) OutputStream для объектов Java. Он также может выводить строку, как байты UTF-8, которые распознаются человеком, в беспорядке двоичных значений.

Формат DOCX (как формат а.с.) является Молнии каталог с содержимым в виде файла XML. XML обычно находится в UTF-8, а для кириллицы это будет немного больше. Однако сжатие затрудняет проблему.

Юникод является нумерацией всех символов, установленных в [0, 2). Существует многобайтовая кодировка UTF-8 для Unicode, что для первых 128 символов ASCII используется один байт, а для остальных - несколько байтов. В этих многобайтовых последовательностях нет \ или около того (набор высоких бит), что удобно. Также байт 0 может избыточно записываться в виде многобайтовой последовательности, что хорошо для программного обеспечения на базе C, такого как операционные системы, которое интерпретирует 0 байт в качестве ограничителя строк (не так Java). UTF-16 использует два байта и может обрабатывать почти все неазиатские скрипты.Если номер Юникода выше, чем 2 , используется аналогичный механизм для последовательностей символов для одного символа Unicode. Для порядка двух байтов есть UTF-16LE (маленький конец) и UTF-16BE (большой конец). Выше в int используется пример big-endian. Процессоры Intel/Windows мало ориентированы.


После того, как комментарий:

Байты представляет собой блок из 8 бит (0 или 1), и его значение 00000000 (= 0), ..., 11111111 (= 255). ASCII символов присвоить некоторый символ число от 0 до 127, как:

32 = ' ' 64 = '@' 
48 = '0' 65 = 'A' 
49 = '1' 66 = 'B' 

На двоичных чисел см wikipedia.

+0

ok, если вы решили записать числа от 1 до 10 в txt в виде байтов, а затем я открываю txt с помощью блокнота, что бы я увидел? Зачем? Также я не совсем понял 0, 0, 2, 12 для 2 * 256 + 12 = 524. Спасибо за ваш ответ – StackExploded

Смежные вопросы