java.io
имеет много разных потоков I/O (FileInputStream, FileOutputStream, FileReader, FileWriter, BufferedStreams... и т.д.) и Я смущен в определении различий между ними. Каковы некоторые примеры, когда один тип потока предпочтительнее другого, и каковы реальные различия между ними?
Потоки ввода/вывода Java; каковы различия?
Ответ 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 Интервью собеседника К.Арулкумарана и А. Сивайни