Зачем нужны методы, считывающие или вводящие примитивы?
Возьмем, например, класс RandomAccessFile. Я не могу понять, зачем там определены методы writeInt, writeDouble, writeChar, если это все в конечном счете будем иметь вид строки в текстовом файле?
Потому что не всегда и не везде будет записываться именно текстовый файл. И ещё потому, что если у кого-нибудь есть источник целых чисел и необходимость из этого источника в файл записать например гигабайт данных, то конвертация данных в строки бесцельно сожрёт как память, так и процессорное время.
NoneDisable, writeChars прямолинейно преобразует char[] в byte[] и затем вызывает writeBytes. writeBytes уже ничего не преобразует, а просто пишет байты в файл.
Собственно, все прочие методы записи занимаются только тем, что преобразуются свои входные данные в массивы байт и вызывают writeBytes.
RandomAccessFile, FileInputStream - это абстракции поверх системного I/O. В идеале они должны
иметь всего 1 метод. Чтения блока байтов в буфер. Но идя навстречу разработчику они любезно
добавили чтение примитивов чтоб читать двоичные форматы например JPG, MP3, SQlite и прочее
в виде sequence из примитивов в правильном порядке.