Что такое InputStream & Output Stream? Почему и когда мы их используем?


290

Кто-нибудь объяснит мне, что InputStreamи OutputStreamесть?

Я запутался по поводу вариантов использования для обоих InputStreamи OutputStream.

Если бы вы могли также добавить фрагмент кода, который сопровождал бы ваше объяснение, это было бы здорово. Спасибо!

Ответы:


219

Цель InputStreamи OutputStreamсостоит в том, чтобы абстрагировать различные способы ввода и вывода: независимо от того, является ли поток файлом, веб-страницей или экраном, значение не имеет. Все, что имеет значение, это то, что вы получаете информацию из потока (или отправляете информацию в этот поток).

InputStream используется для многих вещей, которые вы читаете.

OutputStream используется для многих вещей, которые вы пишете.

Вот пример кода. Предполагается, что InputStream instrи OutputStream osstrуже были созданы:

int i;

while ((i = instr.read()) != -1) {
    osstr.write(i);
}

instr.close();
osstr.close();

67
Что такое «Стрим»?
— Корай Тугай

55
@KorayTugay Поток обычно определяется как набор символов. Точнее, более одного бита или символа называется потоком.
— Гоутхам Гопалакришнан

14
Более чем один символ также является String. Что отличает поток от строки?
— Праджит Шреста

Я думаю, что поток это просто нули и единицы., А не символы.
— smilyface

93

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

Например, вы можете записать примитивные данные в файл:

File file = new File("C:/text.bin");
file.createNewFile();
DataOutputStream stream = new DataOutputStream(new FileOutputStream(file));
stream.writeBoolean(true);
stream.writeInt(1234);
stream.close();

Чтобы прочитать письменное содержание:

File file = new File("C:/text.bin");
DataInputStream stream = new DataInputStream(new FileInputStream(file));
boolean isTrue = stream.readBoolean();
int value = stream.readInt();
stream.close();
System.out.printlin(isTrue + " " + value);

Вы можете использовать другие типы потоков для улучшения чтения / записи. Например, вы можете ввести буфер для эффективности:

DataInputStream stream = new DataInputStream(
    new BufferedInputStream(new FileInputStream(file)));

Вы можете написать другие данные, такие как объекты:

MyClass myObject = new MyClass(); // MyClass have to implement Serializable
ObjectOutputStream stream = new ObjectOutputStream(
    new FileOutputStream("C:/text.obj"));
stream.writeObject(myObject);
stream.close();

Вы можете читать из других источников:

byte[] test = new byte[] {0, 0, 1, 0, 0, 0, 1, 1, 8, 9};
DataInputStream stream = new DataInputStream(new ByteArrayInputStream(test));
int value0 = stream.readInt();
int value1 = stream.readInt();
byte value2 = stream.readByte();
byte value3 = stream.readByte();
stream.close();
System.out.println(value0 + " " + value1 + " " + value2 + " " + value3);

Для большинства входных потоков также есть выходной поток. Вы можете определить свои собственные потоки для чтения / записи специальных вещей, и есть сложные потоки для чтения сложных вещей (например, есть потоки для чтения / записи в формате ZIP).


35

Из учебника по Java :

Поток - это последовательность данных.

Программа использует входной поток для чтения данных из источника, по одному элементу за раз:

введите описание изображения здесь

Программа использует выходной поток для записи данных в пункт назначения, по одному элементу за раз:

введите описание изображения здесь

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

Пример кода из руководства по оракулу:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyBytes {
    public static void main(String[] args) throws IOException {

        FileInputStream in = null;
        FileOutputStream out = null;

        try {
            in = new FileInputStream("xanadu.txt");
            out = new FileOutputStream("outagain.txt");
            int c;

            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

Эта программа использует потоки байтов для копирования xanadu.txt файл outagain.txt , написав один байт в то время ,

Взгляните на этот вопрос SE, чтобы узнать больше о продвинутых символьных потоках, которые являются обертками поверх байтовых потоков:

поток байтов и поток символов


9

вы читаете из InputStream и пишете в OutputStream.

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

Если ваши данные являются символьным потоком, вы можете использовать FileReader вместо InputStream и FileWriter вместо OutputStream, если хотите.

InputStream input = ... // many different types
OutputStream output = ... // many different types

byte[] buffer = new byte[1024];
int n = 0;
while ((n = input.read(buffer)) != -1)
    output.write(buffer, 0, n);

input.close();
output.close();

3
closeвсегда есть flush, так что нет.
— pstanton

5

OutputStream - это абстрактный класс, который представляет выходные данные записи. Существует много различных классов OutputStream, и они записывают определенные вещи (например, экран, файлы, байтовые массивы, сетевые подключения и т. Д.). Классы InputStream имеют доступ к одним и тем же вещам, но они считывают данные из них.

Вот хороший базовый пример использования FileOutputStream и FileInputStream для записи данных в файл и последующего чтения.


4

Поток - это непрерывный поток жидкости, воздуха или газа.

Поток Java - это поток данных из источника в пункт назначения. Источником или местом назначения может быть диск, память, сокет или другие программы. Данные могут быть байтами, символами или объектами. То же самое относится к потокам C # или C ++. Хорошая метафора для потоков Java - вода, вытекающая из крана в ванну, а затем в дренаж.

Данные представляют статическую часть потока; методы чтения и записи - динамическая часть потока.

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


2

Поток : в терминах непрофессионалов поток - это данные, наиболее общий поток - это двоичное представление данных.

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

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


0

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

import java.io.printstream;

class PPrint {
    static PPrintStream oout = new PPrintStream();
}

class PPrintStream {
    void print(String str) { 
        System.out.println(str)
    }
}

class outputstreamDemo {
    public static void main(String args[]) {
        System.out.println("hello world");
        System.out.prinln("this is output stream demo");
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.