Что такое 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.