Co to jest strumień wejściowy i strumień wyjściowy? Dlaczego i kiedy ich używamy?

Niech mi ktoś wyjaśni czym są InputStream i OutputStream?

Jestem zdezorientowany co do przypadków użycia zarówno InputStream jak i OutputStream.

Jeśli mógłbyś również dołączyć fragment kodu do swojego wyjaśnienia, byłoby świetnie. Dzięki!

Author: mccoyLBI, 2009-12-02

8 answers

Celem InputStream i OutputStream Jest abstrakcja różnych sposobów wejścia i wyjścia: to, czy strumień jest plikiem, stroną internetową, czy ekranem, nie powinno mieć znaczenia. Liczy się tylko to, że otrzymujesz informacje ze strumienia (lub wysyłasz je do tego strumienia.)

InputStream jest używany do wielu rzeczy, z których czytasz.

OutputStream jest używany do wielu rzeczy, do których piszesz.

Oto przykładowy kod. Zakłada, że InputStream instr i OutputStream osstr zostały już utworzone:
int i;

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

instr.close();
osstr.close();
 187
Author: Chip Uni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-27 11:25:27

InputStream służy do odczytu, OutputStream do zapisu. Są one połączone ze sobą jako dekoratory, dzięki czemu można odczytywać/zapisywać wszystkie różne typy danych ze wszystkich różnych typów źródeł.

Na przykład, możesz zapisać prymitywne dane do pliku:

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

Aby przeczytać spisaną treść:

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

Możesz używać innych rodzajów strumieni, aby poprawić odczyt/zapis. Na przykład, można wprowadzić bufor dla efektywności:

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

Możesz napisać inne dane takie jak obiekty:

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

Możesz czytać z innych źródeł wejściowych:

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

Dla większości strumieni wejściowych istnieje również strumień wyjściowy. Możesz definiować własne strumienie do odczytu / zapisu specjalnych rzeczy i istnieją złożone strumienie do odczytu złożonych rzeczy (na przykład są strumienie do odczytu/zapisu formatu ZIP).

 83
Author: Arne Deutsch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-26 20:32:39

From the Java Tutorial:

Strumień jest sekwencją danych.

program wykorzystuje strumień wejściowy do odczytu danych ze źródła, po jednym elemencie na raz:

Tutaj wpisz opis obrazka

program używa strumienia wyjściowego do zapisu danych do miejsca docelowego, po jednym elemencie na raz:

Tutaj wpisz opis obrazka

Źródłem i miejscem docelowym danych na zdjęciu powyżej może być wszystko, co przechowuje, generuje lub zużywa dane. Oczywiście obejmuje to pliki dyskowe , ale źródłem lub miejscem docelowym może być również inny program, urządzenie peryferyjne, gniazdo sieciowe lub tablica.

Przykładowy kod z samouczka 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();
            }
        }
    }
}

Ten program używa strumieni bajtów do kopiowania xanadu.txt plik do outagain.txt , zapisując jeden bajt na raz

Spójrz na to pytanie SE, aby dowiedzieć się więcej o zaawansowanych strumieniach postaci, które są wrappery na strumieniach bajtów:

Strumień bajtów i strumień znaków

 25
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-17 02:19:10

Czytasz ze strumienia wejściowego i piszesz do strumienia wyjściowego.

Na przykład, powiedzmy, że chcesz skopiować plik. Można utworzyć strumień plików do odczytu z pliku źródłowego i strumień plików do zapisu do nowego pliku.

Jeśli Twoje dane są strumieniem znaków, możesz użyć FileReader zamiast strumienia wejściowego i FileWriter zamiast strumienia wyjściowego, jeśli wolisz.

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();
 9
Author: pstanton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-02 04:56:50

OutputStream jest klasą abstrakcyjną, która reprezentuje zapis wyjścia. Istnieje wiele różnych klas strumienia wyjściowego i zapisują one pewne rzeczy (jak ekran, pliki, tablice bajtów, połączenia sieciowe itp.). Klasy InputStream mają dostęp do tych samych rzeczy, ale odczytują z nich dane.

Oto dobry podstawowy przykład użycia FileOutputStream i FileInputStream do zapisu danych do pliku, a następnie do odczytu z powrotem.

 5
Author: Kaleb Brasee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-02 04:54:57
Strumień jest ciągłym przepływem cieczy, powietrza lub gazu.

Java stream jest przepływem danych ze źródła lub do miejsca docelowego. Źródłem lub miejscem docelowym może być Dysk, Pamięć, gniazdo lub inne programy. Dane mogą być bajtami, znakami lub obiektami. To samo dotyczy strumieni C# lub c++. Dobrą metaforą dla strumieni Jawy jest woda płynąca z kranu do wanny, a później do drenażu.

Dane przedstawiają statyczną część strumienia; odczyt i Zapisz metody dynamicznej części strumienia.

InputStream reprezentuje przepływ danych ze źródła, OutputStream reprezentuje przepływ danych do miejsca docelowego. Wreszcie, InputStream i OutputStream są abstrakcjami nad dostępem niskiego poziomu do danych, takimi jak wskaźniki plików C.

 1
Author: Jan Bodnar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-12 18:01:04

Strumień wyjściowy jest ogólnie związany z jakimś miejscem docelowym danych, takim jak plik lub sieć etc.In java output stream jest miejscem docelowym, w którym dane są ostatecznie zapisywane i kończą się

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");
    }
}
 0
Author: Deep Arora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-24 15:42:23

Stream: w terminach laików stream to dane, większość generyczna stream to binarna reprezentacja danych.

input Stream : Jeśli czytasz dane z pliku lub innego źródła , używany strumień jest strumieniem wejściowym. W uproszczeniu strumień wejściowy działa jako kanał do odczytu danych.

Output Stream : jeśli chcesz odczytać i przetworzyć dane ze źródła (plik itp.), Musisz najpierw zapisać dane, środkiem do przechowywania danych jest output stream .

 0
Author: Sher Mohammad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-15 04:45:42