Що таке InputStream & Output Stream? Чому і коли ми їх використовуємо?


290

Хтось мені пояснить, що таке InputStreamі що OutputStream?

Мене плутають випадки використання і для, InputStreamі для OutputStream.

Якщо ви також можете включити фрагмент коду, який слід разом із вашим поясненням, це було б чудово. Дякую!

Відповіді:


218

Мета 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 Потік, як правило, визначається як набір символів. Якщо точніше, більше одного біта або символу називається потоком.
Gowtham Gopalakrishnan

14
Більше одного символу також є String. Що відрізняє потік від рядка?
Prajeet Shrestha

Я думаю, що потік - це просто нулі і ті, а не символи.
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 :

Потік - це послідовність даних.

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

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

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

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

Джерелом даних та пунктом призначення даних, зображеним вище, може бути все, що містить, генерує або споживає дані. Очевидно, це включає файли диска , але джерелом або пунктом призначення також може бути інша програма, периферійний пристрій, мережевий сокет або масив .

Приклад коду з підручника oracle:

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 ++. Хороша метафора для потоків Яви - вода, що стікає з крана у ванну, а пізніше в каналізацію.

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

InputStreamявляє собою потік даних з джерела, OutputStreamявляє собою потік даних у пункт призначення. Нарешті, InputStreamі OutputStreamце абстракції щодо доступу низького рівня до даних, таких як покажчики на файли C.


2

Потік : У термінах мирян потік - це дані, найбільш загальний потік - це двійкове представлення даних.

Вхідний потік : Якщо ви читаєте дані з файлу або будь-якого іншого джерела, використовуваний потік - це вхідний потік. Простіше кажучи, вхідний потік виступає як канал для зчитування даних.

Вихідний потік : Якщо ви хочете прочитати та обробити дані з джерела (файлу тощо), вам спочатку потрібно зберегти дані, середнє значення для зберігання даних - це вихідний потік.


0

Вихідний потік, як правило, пов'язаний з деяким пунктом призначення даних, наприклад, файлом або мережею і т.д.

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.