Потоки ввода/вывода Java; каковы различия?

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

Ответ 1

Это большая тема! Я бы рекомендовал начать с чтения потоков ввода-вывода:

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

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

Ответ 2

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

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

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

Ответ 3

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

Струйные

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

Читатели/Писатели

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

буферизация

  • всегда полезно, если не доказано иначе

Ответ 4

Разделите каждое имя на слова: каждый капитал - это другое слово.

  • Входной поток файла - это получить Вход из Файл с помощью Поток.
  • Выходной поток файла - это записать Вывод в Файл с помощью Потока

И так далее и т.д.

Как писал mmyers:

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Это, вероятно, самый тщательный обзор различных потоков, Reader и Writer в API IO Java:

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

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

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

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

Ответ 8

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

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

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

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

Ответ 9

Ввод и вывод Java определяются в терминах абстрактного понятия, называемого "потоком", который представляет собой последовательность данных. Существует 2 вида потоков.

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

java.io. * классы используют шаблон оформления декоратора. Применяется шаблон дизайна декоратора обязанности перед объектами во время выполнения. Декораторы более гибкие, чем наследование, потому что наследование присоединяет ответственность к занятиям во время компиляции. В классах java.io. * используется шаблон декоратора для построения различные комбинации поведения во время выполнения на основе некоторых базовых классов. введите описание изображения здесь введите описание изображения здесь

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