Co to jest InputStream i Output Stream? Dlaczego i kiedy ich używamy?

290

Ktoś mi wyjaśni InputStreami czym OutputStreamjest?

Jestem zdezorientowany co do przypadków użycia zarówno dla, jak InputStreami dla OutputStream.

Jeśli możesz dołączyć fragment kodu wraz z wyjaśnieniem, byłoby świetnie. Dzięki!

Czech
źródło

Odpowiedzi:

218

Celem InputStreami OutputStreamjest wyodrębnienie różnych sposobów wprowadzania i wyprowadzania: czy strumień jest plikiem, stroną internetową czy ekranem nie powinno mieć znaczenia. Liczy się tylko to, że otrzymujesz informacje ze strumienia (lub wysyłasz informacje 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 InputStream instri OutputStream osstrzostały już utworzone:

int i;

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

instr.close();
osstr.close();
Chip Uni
źródło
67
Co to jest „strumień”?
Koray Tugay
55
@KorayTugay Strumień jest ogólnie definiowany jako zestaw znaków. Aby być bardziej precyzyjnym, więcej niż jeden bit lub znak jest nazywany strumieniem.
Gowtham Gopalakrishnan
14
Więcej niż jeden znak to także String. Co odróżnia strumień od ciągu?
Prajeet Shrestha
Myślę, że strumień składa się z zer i jedynek. Nie znaków.
smilyface,
93

InputStream służy do odczytu, OutputStream do pisania. Są one połączone ze sobą jako dekoratory, dzięki czemu można odczytywać / zapisywać wszystkie różne typy danych ze wszystkich różnych rodzajó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żyć innych rodzajów strumieni, aby poprawić odczyt / zapis. Na przykład możesz wprowadzić bufor wydajności:

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

Możesz pisać 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óżnych ź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 zdefiniować własne strumienie do czytania / pisania specjalnych rzeczy, a istnieją złożone strumienie do czytania skomplikowanych rzeczy (na przykład istnieją strumienie do odczytu / zapisu w formacie ZIP).

Arne Deutsch
źródło
35

Z samouczka Java :

Strumień to sekwencja danych.

Program wykorzystuje strumień wejściowy do odczytu danych ze źródła, pojedynczo:

wprowadź opis zdjęcia tutaj

Program wykorzystuje strumień wyjściowy do zapisywania danych do miejsca docelowego, pojedynczo:

wprowadź opis zdjęcia tutaj

Źródło danych i miejsce docelowe danych przedstawione powyżej mogą być wszystkim, 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();
            }
        }
    }
}

Program ten wykorzystuje bajt strumieni skopiować xanadu.txt plik outagain.txt , pisząc jeden bajt na raz

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

strumień bajtów i strumień znaków

Ravindra babu
źródło
9

czytasz z InputStream i piszesz do OutputStream.

na przykład powiedz, że chcesz skopiować plik. Utworzyłbyś FileInputStream do odczytu z pliku źródłowego i FileOutputStream do zapisu do nowego pliku.

Jeśli twoje dane są strumieniem znaków, możesz użyć FileReader zamiast InputStream i FileWriter zamiast OutputStream, 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();
pstanton
źródło
3
closezawsze flushes, więc nie.
pstanton
5

OutputStream to klasa abstrakcyjna reprezentująca zapisywanie danych wyjściowych. Istnieje wiele różnych klas OutputStream i piszą one do pewnych rzeczy (takich jak ekran, Pliki, tablice bajtów, połączenia sieciowe itp.). Klasy InputStream uzyskują dostęp do tych samych rzeczy, ale odczytują z nich dane.

Oto dobry podstawowy przykład użycia FileOutputStream i FileInputStream do zapisania danych do pliku, a następnie odczytania go ponownie.

Kaleb Brasee
źródło
4

Strumień to ciągły przepływ cieczy, powietrza lub gazu.

Strumień Java to przepływ danych ze źródła 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ą strumieni Java jest woda płynąca z kranu do wanny, a później do drenażu.

Dane reprezentują statyczną część strumienia; metody odczytu i zapisu stanowią część dynamiczną strumienia.

InputStreamreprezentuje przepływ danych ze źródła, OutputStreamreprezentuje przepływ danych do miejsca docelowego. Wreszcie, InputStreami OutputStreamto abstrakcje ponad dostępu niskiego poziomu do danych, takich jak C wskaźniki plików.

Jan Bodnar
źródło
2

Strumień : W kategoriach laików strumień to dane, najbardziej ogólny strumień to binarna reprezentacja danych.

Strumień wejściowy : jeśli czytasz dane z pliku lub innego źródła, używany strumień to strumień wejściowy. Mówiąc prościej, strumień wejściowy działa jak kanał do odczytu danych.

Strumień wyjściowy : Jeśli chcesz czytać i przetwarzać dane ze źródła (pliku itp.), Musisz najpierw zapisać dane, środkiem do przechowywania danych jest strumień wyjściowy.

Sher Mohammad
źródło
0

Strumień wyjściowy jest ogólnie związany z miejscem docelowym danych, takim jak plik lub sieć itp. W strumieniu wyjściowym Java jest miejsce docelowe, w którym dane są ostatecznie zapisywane i kończą

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");
    }
}
Deep Arora
źródło