Байтові та символьні потоки.

Базові технології Java /

Файли та потоки введення/виводу

Доброго дня! У яких випадках використовують байтові, а в яких символьні потоки? Наприклад хочу записати у файл рядок:

В обох випадках результат той самий. Ось і постало питання, яка різниця? І друге, класи DataInputStream, DataOutputStream для конвертації потоків які мають переваги? Дякую!

Символьні потоки виходять з байтових коли ви їх за допомогою якогось кодування перетворюєте байти в букви (у внутрішньому java-нському форматі, ну в загальному юнікод).

Відповідно, символьні потоки доречно використовувати для текстових даних, а байтові для двійкових. :)

Смішніші випадки виникають наприклад коли у вас файл з текстом, але кодування ви не знаєте і хочете визначити його автоматично. Тоді ви спочатку читаєте його байтовим потоком як двійковий файл, і за статистичним розподілом байтів визначаєте кодування. Після цього читаєте спочатку, але вже символьним потоком із цим кодуванням.

Ви все-таки не розумієте :)

Через мережу ви можете передавати байти, тільки байти і нічого крім байтів. Ви не можете передати символи абстрактно. Вони повинні бути кодовані в байти для передачі через мережу або запису до файлу.

Доки таблиця кодування використовувана при перетворенні на байти збігається з тією, що використовується одержувачем (або читачем файлу) все дійсно буде "так само читабельно". Наприклад, якщо ви з віндового комп'ютера на віндовий передаєте, у java-машині кодування за замовчуванням у 90% випадків буде однакове, тому проблеми ви не помітите. Але цілком можливо, що вам зателефонує гнівний користувач і скаже "а у мене на macbook ваш гуанософт ні хрону не працює, це неподобство, ви мені заплатите" і т.п. :)

Тобто. якщови плануєте щось зберігати у файли або передавати по мережі, потрібно обов'язково з самого початку вирішити, яке кодування ви будете використовувати. Власне utf-8 краще за більшість інших поширених тим, що дозволяє кодувати практично будь-який юнікодовий символ, тоді як віндові кодування мають таблицю лише з 256 символів і зазвичай прив'язані до конкретної мови (української, європейської) а з китайською вони взагалі не впораються. Правда якщо текст цілком з неанглійських символів повідомлення в utf-8 звичайно довше в два рази.

(А взагалі якщо передавати великий текст то може виявитися зручним взагалі його стиснути в zip - благо в java для цього є API - і передавати вже стислий)