Потоки ввода / вывода Java; какие различия? - PullRequest
20 голосов
/ 21 июля 2009

java.io имеет много различных потоков I / O (FileInputStream, FileOutputStream, FileReader, FileWriter, BufferedStreams ... и т. Д.), И я не могу определить различия между ними. Каковы некоторые примеры, когда один тип потока предпочтительнее другого, и каковы реальные различия между ними?

Ответы [ 9 ]

37 голосов
/ 21 июля 2009

Потоки: по одному байту за раз. Хорошо для двоичных данных.

Читатели / Авторы: по одному символу за раз. Хорошо для текстовых данных.

Все, что «буферизовано»: много байтов / символов одновременно. Хорошо почти все время.

24 голосов
/ 21 июля 2009

При изучении Java я разработал эту ментальную схему о java.io:

Streams

  • ориентированный на байты поток (8 бит)
  • хорошо для двоичных данных, таких как файл Java .class
  • хорошо для "машинно-ориентированных" данных

Читатели / Авторы

  • char (utf-16) ориентированный поток (16 бит)
  • хорошо для текста, такого как источник Java
  • хорошо для "ориентированных на человека" данных

буферизация

  • всегда полезно, если не доказано иное
12 голосов
/ 21 июля 2009

Это большая тема! Я бы рекомендовал вам начать с чтения I / O Streams :

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

Потоки поддерживают множество различных видов данных, в том числе простых байтов, примитивные типы данных, локализованные персонажи и предметы. Несколько потоков просто передать данные; другие манипулируют и преобразовать данные полезными способами.

8 голосов
/ 21 июля 2009

Разделите каждое имя на слова: каждая заглавная буква - это отдельное слово.

  • Поток ввода файла предназначен для получения Ввода из файла с использованием Stream .
  • Поток вывода файла предназначен для записи Вывод в Файл с использованием Stream

И так далее и тому подобное

Как писал mmyers:

Потоки: один байт за раз.

Читатели / Авторы: один символ за раз.

Буферизованные *: много байтов / символов одновременно.

5 голосов
/ 04 ноября 2009

Я также нашел это java_tip_how_read_files_quickly

Очень полезно! Он показывает, какие потоки наиболее эффективны.

3 голосов
/ 10 декабря 2009

Это, пожалуй, самый полный обзор различных потоков, Reader's и Writer в Java IO API:

http://tutorials.jenkov.com/java-io/overview.html

Это часть большого учебного пособия по Java IO, охватывающего потоки на основе байтов и символов.

Он также охватывает потоки, которые используются для чтения и записи необработанных числовых данных, например, числа типа int и т.п.

Он также охватывает потоки, используемые для синтаксического анализа, такие как PushbackInputStream и PushbackReader.

3 голосов
/ 21 июля 2009

Упомянутые вами специализации - это конкретные типы, используемые для обеспечения стандартного интерфейса для различных источников данных. Например, FileInputStream и ObjectInputStream будут реализовывать интерфейс InputStream, но будут работать с файлами и объектами соответственно.

2 голосов
/ 10 ноября 2009

Потоки байтов в основном и широко используются в java 1.0 как для символьных, так и для байтовых потоков. После Java 1.0 он устарел, и потоки символов играют важную роль. т.е., например

BufferedReader получит персонажа из источника, а его конструктор выглядит так BufferedReader (Читатель inputReader) ..

Здесь Reader является абстрактным классом, и одним из его конкретных классов является InputStreamReader, который преобразует байты в символы и принимает ввод с клавиатуры (System.in) ...

BufferedReader: содержит внутренний буфер, который будет читать символы из потока. Внутренний счетчик отслеживает следующий символ, который будет передан в буфер через read (). InputStreamReader принимает входные данные в байтах и ​​внутренне преобразует их в символы.

1 голос
/ 24 ноября 2017

Ввод и вывод Java определяется в терминах абстрактного понятия, называемого «поток», который представляет собой последовательность данных. Есть 2 вида потоков.

  • Потоки байтов (8-битные байты) Æ Абстрактные классы: InputStream и OutputStream
  • Потоки символов (16-битный UNICODE) Æ Абстрактные классы: Reader и Writer

java.io. * классы используют шаблон дизайна декоратора. Шаблон оформления декоратор придает ответственность за объекты во время выполнения. Декораторы более гибкие, чем наследование, потому что наследование возлагает ответственность на классы во время компиляции. Классы java.io. * используют шаблон декоратора для создания различные комбинации поведения во время выполнения на основе некоторых базовых классов. enter image description hereenter image description here

из книги Java / J2EE, собеседование при приеме на работу К. Арулкумаран и А. Сивайини

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