Odpowiedzi:
Celem InputStream
i OutputStream
jest 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 instr
i OutputStream osstr
zostały już utworzone:
int i;
while ((i = instr.read()) != -1) {
osstr.write(i);
}
instr.close();
osstr.close();
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).
Z samouczka Java :
Strumień to sekwencja danych.
Program wykorzystuje strumień wejściowy do odczytu danych ze źródła, pojedynczo:
Program wykorzystuje strumień wyjściowy do zapisywania danych do miejsca docelowego, pojedynczo:
Ź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:
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();
close
zawsze flush
es, więc nie.
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.
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.
InputStream
reprezentuje przepływ danych ze źródła, OutputStream
reprezentuje przepływ danych do miejsca docelowego. Wreszcie, InputStream
i OutputStream
to abstrakcje ponad dostępu niskiego poziomu do danych, takich jak C wskaźniki plików.
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.
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");
}
}