Должен ли я использовать DataInputStream или BufferedInputStream - PullRequest
14 голосов
/ 10 апреля 2009

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

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

Я прав - есть ли смысл?

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

Ответы [ 6 ]

18 голосов
/ 10 апреля 2009

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

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

7 голосов
/ 10 апреля 2009

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

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

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

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

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

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

5 голосов
/ 30 октября 2015

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

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

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

4 голосов
/ 18 сентября 2014

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

final InputStream inputStream = ...;
final BufferedInputStream bufferedInputStream =
        new BufferedInputStream(inputStream);
final DataInputStream dataInputStream =
        new DataInputStream(bufferedInputStream);
3 голосов
/ 16 июля 2011

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

2 голосов
/ 10 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...