Was ist InputStream & Output Stream? Warum und wann verwenden wir sie?


290

Jemand erklärt mir was InputStreamund OutputStreamsind?

Ich bin verwirrt über die Anwendungsfälle für beide InputStreamund OutputStream.

Wenn Sie Ihrer Erklärung auch einen Codeausschnitt hinzufügen könnten, wäre das großartig. Vielen Dank!

Antworten:


218

Das Ziel von InputStreamund OutputStreamist es, verschiedene Arten der Eingabe und Ausgabe zu abstrahieren: Ob der Stream eine Datei, eine Webseite oder der Bildschirm ist, sollte keine Rolle spielen. Alles, was zählt, ist, dass Sie Informationen vom Stream empfangen (oder Informationen in diesen Stream senden).

InputStream wird für viele Dinge verwendet, aus denen Sie lesen.

OutputStream wird für viele Dinge verwendet, an die Sie schreiben.

Hier ist ein Beispielcode. Es geht davon aus, dass InputStream instrund OutputStream osstrbereits erstellt wurden:

int i;

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

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

67
Was ist ein "Stream"?
Koray Tugay

55
@KorayTugay Ein Stream wird im Allgemeinen als Zeichensatz definiert. Genauer gesagt wird mehr als ein Bit oder Zeichen als Stream bezeichnet.
Gowtham Gopalakrishnan

14
Mehr als ein Zeichen ist auch String. Was unterscheidet Stream von String?
Prajeet Shrestha

Ich denke, ein Stream besteht nur aus Nullen und Einsen, nicht aus Zeichen.
Smilyface

93

InputStream wird zum Lesen verwendet, OutputStream zum Schreiben. Sie sind als Dekorateure miteinander verbunden, sodass Sie alle Arten von Daten aus allen Arten von Quellen lesen / schreiben können.

Sie können beispielsweise primitive Daten in eine Datei schreiben:

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

So lesen Sie den schriftlichen Inhalt:

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

Sie können andere Arten von Streams verwenden, um das Lesen / Schreiben zu verbessern. Sie können beispielsweise einen Puffer für die Effizienz einführen:

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

Sie können andere Daten wie Objekte schreiben:

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

Sie können aus anderen verschiedenen Eingabequellen lesen:

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

Für die meisten Eingabestreams gibt es auch einen Ausgabestream. Sie können Ihre eigenen Streams zum Lesen / Schreiben spezieller Dinge definieren und es gibt komplexe Streams zum Lesen komplexer Dinge (zum Beispiel gibt es Streams zum Lesen / Schreiben des ZIP-Formats).


35

Aus dem Java-Tutorial :

Ein Stream ist eine Folge von Daten.

Ein Programm verwendet einen Eingabestream, um Daten aus einer Quelle einzeln zu lesen:

Geben Sie hier die Bildbeschreibung ein

Ein Programm verwendet einen Ausgabestream, um Daten einzeln an ein Ziel zu schreiben:

Geben Sie hier die Bildbeschreibung ein

Die oben abgebildete Datenquelle und das Datenziel können alles sein, was Daten enthält, generiert oder verbraucht. Dies umfasst natürlich Festplattendateien , aber eine Quelle oder ein Ziel kann auch ein anderes Programm, ein Peripheriegerät, ein Netzwerk-Socket oder ein Array sein .

Beispielcode von Oracle Tutorial:

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

Dieses Programm verwendet Byte-Streams, um die Datei xanadu.txt in outagain.txt zu kopieren , indem jeweils ein Byte geschrieben wird

Schauen Sie sich diese SE-Frage an, um weitere Details zu erweiterten Charakter-Streams zu erfahren, die Wrapper über Byte-Streams sind:

Byte-Stream und Zeichen-Stream


9

Sie lesen aus einem InputStream und schreiben in einen OutputStream.

Angenommen, Sie möchten eine Datei kopieren. Sie würden einen FileInputStream zum Lesen aus der Quelldatei und einen FileOutputStream zum Schreiben in die neue Datei erstellen.

Wenn Ihre Daten ein Zeichenstrom sind, können Sie einen FileReader anstelle eines InputStream und einen FileWriter anstelle eines OutputStream verwenden, wenn Sie dies bevorzugen.

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
closeimmer flushes, also nein.
Pstanton

5

OutputStream ist eine abstrakte Klasse, die das Schreiben von Ausgaben darstellt. Es gibt viele verschiedene OutputStream-Klassen, die bestimmte Dinge ausschreiben (z. B. den Bildschirm oder Dateien oder Byte-Arrays oder Netzwerkverbindungen usw.). InputStream-Klassen greifen auf dieselben Dinge zu, lesen jedoch Daten von ihnen ein.

Hier ist ein gutes grundlegendes Beispiel für die Verwendung von FileOutputStream und FileInputStream, um Daten in eine Datei zu schreiben und sie dann wieder einzulesen.


4

Ein Strom ist ein kontinuierlicher Fluss von Flüssigkeit, Luft oder Gas.

Java-Stream ist ein Datenfluss von einer Quelle zu einem Ziel. Die Quelle oder das Ziel kann eine Festplatte, ein Speicher, ein Socket oder andere Programme sein. Die Daten können Bytes, Zeichen oder Objekte sein. Gleiches gilt für C # - oder C ++ - Streams. Eine gute Metapher für Java-Streams ist Wasser, das aus einem Wasserhahn in eine Badewanne und später in einen Abfluss fließt.

Die Daten stellen den statischen Teil des Streams dar; Die Lese- und Schreibmethoden sind der dynamische Teil des Streams.

InputStreamstellt einen Datenfluss von der Quelle dar, der OutputStreameinen Datenfluss in das Ziel darstellt. Schließlich InputStreamund OutputStreamsind Abstraktionen über den Zugriff auf Daten auf niedriger Ebene, wie z. B. C-Dateizeiger.


2

Stream : In Laienbegriffen ist Stream Daten, der allgemeinste Stream ist eine binäre Darstellung von Daten.

Eingabestream : Wenn Sie Daten aus einer Datei oder einer anderen Quelle lesen, wird als Stream der Eingabestream verwendet. Einfacher ausgedrückt fungiert der Eingabestream als Kanal zum Lesen von Daten.

Ausgabestream : Wenn Sie Daten aus einer Quelle (Datei usw.) lesen und verarbeiten möchten, müssen Sie zuerst die Daten speichern. Der Mittelwert zum Speichern von Daten ist der Ausgabestream.


0

Ein Ausgabestream bezieht sich im Allgemeinen auf ein Datenziel wie eine Datei oder ein Netzwerk usw. Der Java-Ausgabestream ist ein Ziel, an dem Daten schließlich geschrieben werden und enden

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");
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.