„Bună ziua, Amigo! Acum vă voi vorbi despre două interfețe: InputStream și OutputStream . Sunt declarate ca clase abstracte, dar dacă cercetați mai profund, puteți vedea că sunt în esență interfețe . Aproape toate metodele lor sunt abstracte, cu excepția câteva metode nesemnificative. Ele seamănă foarte mult cu „ garda de corp ” pe care am considerat-o mai devreme.
Acestea sunt interfețe foarte interesante. Deocamdată, le voi numi în mod deliberat interfețe , ca să înțelegeți de ce avem nevoie de ele. Și apoi vom vorbi despre de ce sunt de fapt clase abstracte.
"Bine. Deci care sunt aceste interfețe?"
— O să-ți spun fără alte prelungiri.
Java are acest lucru interesant numit „ flux ”. Un flux este o entitate foarte simplă. Iar simplitatea sa este cheia pentru un mod foarte puternic de a face schimb de date. Există două tipuri de fluxuri: fluxuri pentru citire și fluxuri pentru scriere .
După cum probabil ați ghicit deja, puteți scrie date într- un flux pentru scriere . Are o metodă de scriere pentru asta. Puteți citi date dintr- un flux pentru citire . Are o metodă de citire () pentru aceasta.
InputStream este interfața pentru un flux care acceptă citirea. Acesta definește următoarea abilitate: „octeții pot fi citiți de la mine”.
În mod similar, OutputStream , un OutputStream este o interfață pentru un flux care acceptă scrierea. Ea definește următoarea abilitate: „mi pot fi scrieți octeți”.
"Asta este?"
"Destul de mult. Dar ideea este că Java are o mulțime de clase care pot funcționa cu InputStream și OutputStream . De exemplu, doriți să citiți un fișier de pe disc și să afișați conținutul acestuia pe ecran. Nimic nu ar putea fi mai ușor."
Pentru a citi date dintr-un fișier de pe disc, avem clasa specială FileInputStream , care implementează interfața InputStream . Doriți să scrieți aceste date într-un alt fișier? Pentru aceasta, avem clasa FileOutputStream , care implementează interfața OutputStream . Următorul cod arată ce trebuie să faceți pentru a copia datele dintr-un fișier în altul.
public static void main(String[] args) throws IOException
{
InputStream inStream = new FileInputStream("c:/source.txt");
OutputStream outStream = new FileOutputStream("c:/result.txt");
while (inStream.available() > 0)
{
int data = inStream.read(); //read one byte from the input stream
outStream.write(data); //write that byte to the other stream.
}
inStream.close(); //close the streams
outStream.close();
}
Imaginează-ți că am scris o clasă și i-am adăugat abilitățile InputStream și OutputStream .
Dacă am implementat corect aceste interfețe, atunci instanțe ale clasei noastre pot fi acum salvate sau citite dintr-un fișier. Pur și simplu citind conținutul lor folosind metoda citire . Sau pot fi încărcate dintr-un fișier prin crearea unui obiect și folosind metoda de scriere pentru a scrie conținutul fișierului.
— Poate un exemplu?
"Sigur."
Cod | Descriere |
---|---|
|
Pentru simplitate, imaginați-vă că clasa noastră conține un obiect, un ArrayList care conține numere întregi. |
Acum îi vom adăuga metode de citire și scriere
Cod | Descriere |
---|---|
|
Acum, clasa noastră implementează metoda read , care face posibilă citirea secvențială a întregului conținut al listei .
Și metoda write , care vă permite să scrieți valori în lista noastră. |
Desigur, aceasta nu este o implementare a interfețelor InputStream și OutputStream, dar este foarte asemănătoare.
"Da, înțeleg. Deci cum salvezi conținutul unui astfel de obiect într-un fișier?"
„Permiteți-mi să vă dau un exemplu:”
public static void main(String[] args)
{
MyClass myObject = new MyClass();
OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");
while (myObject.available() > 0)
{
int data = myObject.read(); //read one int from the input stream
outStream.write(data); //write that int to the other stream.
}
outStream.close();
}
public static void main(String[] args)
{
InputStream inStream = new FileInputStream("c:/my-object-data.txt");
MyClass myObject = new MyClass();
while (inStream.available() > 0)
{
int data = inStream.read(); //read one int from the input stream
myObject.write(data); //write that int to the other stream.
}
inStream.close(); //close the streams
}
"Holy Moly! Este într-adevăr foarte asemănător cu lucrul cu InputStream/OutputStream. Fluxurile sunt drăguțe!"
— Și apoi niște!
GO TO FULL VERSION