Что такое InputStream & Output Stream? Почему и когда мы их используем? - PullRequest
268 голосов
/ 02 декабря 2009

Кто-то объяснит мне, что такое InputStream и OutputStream?

Я запутался в случаях использования как InputStream, так и OutputStream.

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

Ответы [ 8 ]

201 голосов
/ 02 декабря 2009

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

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

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

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

int i;

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

instr.close();
osstr.close();
86 голосов
/ 02 декабря 2009

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).

30 голосов
/ 28 марта 2016

Из Java Tutorial :

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

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

enter image description here

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

enter image description here

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

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

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 голосов
/ 02 декабря 2009

вы читаете из 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();
5 голосов
/ 02 декабря 2009

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

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

3 голосов
/ 18 декабря 2017

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

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

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

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

2 голосов
/ 15 ноября 2017

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

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

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

0 голосов
/ 24 июня 2017

Выходной поток, как правило, связан с некоторым назначением данных, таким как файл, сеть и т. Д. В выходном потоке 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");
    }
}
...