Должен ли я использовать DataInputStream или BufferedInputStream

Я хочу прочитать каждую строку из текстового файла и сохранить их в ArrayList (каждая строка является одной записью в ArrayList).

До сих пор я понимаю, что BufferedInputStream записывает в буфер и делает только одно чтение после того, как буфер пуст, что сводит к минимуму или, по крайней мере, уменьшает количество операций операционной системы.

Правильно ли? Имею ли смысл?

Если это так, в каких ситуациях кто-либо захочет использовать DataInputStream. И, наконец, какой из двух я должен использовать и почему - или это не имеет значения.

Ответ 1

Используйте обычный InputStream (например, FileInputStream), завернутый в InputStreamReader, а затем завернутый в BufferedReader, затем вызовите readLine в BufferedReader.

DataInputStream хорош для чтения примитивов, строк с префиксом длины и т.д.

Ответ 2

Два класса не являются взаимоисключающими - вы можете использовать их оба, если вам это подходит.

Как вы подобрали, BufferedInputStream - это чтение в блоках данных, а не один байт за раз. Он также предоставляет удобный метод readLine(). Тем не менее, он также используется для подглядывания данных, находящихся далее в потоке, затем, если требуется, назад к предыдущей части потока (см. Методы меток() и reset()).

DataInputStream/DataOutputStream предоставляет удобные методы для чтения/записи определенных типов данных. Например, он имеет способ записи/чтения строки UTF. Если бы вы сделали это самостоятельно, вам нужно было бы решить, как определить конец строки (т.е. С байт терминатора или указав длину строки).

Это отличается от BufferedInputStream readLine(), который, как кажется по способу, возвращает только одну строку. writeUTF()/readUTF() обрабатывает строки - эта строка может иметь столько строк, сколько она хочет.

BufferedInputStream подходит для большинства целей обработки текста. Если вы делаете что-то особенное, например, пытаетесь сериализовать поля класса в файл, вы должны использовать DataInput/OutputStream, поскольку он обеспечивает больший контроль над данными на двоичном уровне.

Надеюсь, что это поможет.

Ответ 3

InputStream: Базовый класс для чтения байта из потока (сети или файла), обеспечивает возможность считывать байт из потока и удалять конец потока.

DataInputStream: Для чтения данных непосредственно в виде примитивного типа данных.

BufferInputStream: Чтение данных из входного потока и использование буфера для оптимизации скорости доступа к данным.

Ответ 4

Вы всегда можете использовать оба параметра:

final InputStream inputStream = ...;
final BufferedInputStream bufferedInputStream =
        new BufferedInputStream(inputStream);
final DataInputStream dataInputStream =
        new DataInputStream(bufferedInputStream);

Ответ 5

Я бы рекомендовал использовать Jakarta Commons IO и readlines ( ) (любого разнообразия).

Он будет следить за буферизацией/закрытием и т.д. и вернуть вам список текстовых строк. Я с радостью откажу свой собственный поток потока ввода с буферизацией и т.д., Но девять раз из десяти Commons IO отлично работает и является достаточным/более кратким/менее подверженным ошибкам и т.д.

Ответ 6

Вы используете DataInputStream в случаях, когда вам нужно интерпретировать примитивные типы в файле, написанном языком Java, независимо от платформы.