"Hej, Amigo! I dag vil vi stifte bekendtskab med input/output-streams . Vi valgte dette emne for et par dage siden, men i dag vil vi undersøge det grundigt. Input/output-streams er opdelt i 4 kategorier:"

1) Strømme er opdelt efter deres retning: inputstrømme og outputstrømme

2) Strømme er opdelt efter deres datatype: dem, der arbejder med bytes , og dem, der arbejder med tegn .

Her er disse inddelinger repræsenteret i en tabel:

Input strøm Udgangsstrøm
Fungerer med bytes InputStream OutputStream
Arbejder med karakterer Læser Forfatter

Hvis et objekt implementerer InputStream- grænsefladen, understøtter det muligheden for sekventielt at læse bytes fra det.

Hvis et objekt implementerer OutputStream- grænsefladen, understøtter det muligheden for sekventielt at skrive bytes til det.

Hvis et objekt implementerer Reader- grænsefladen, understøtter det muligheden for sekventielt at læse tegn (tegn) fra det.

Hvis et objekt implementerer Writer- grænsefladen, understøtter det muligheden for sekventielt at skrive tegn (tegn) til det.

Input-/outputstrømme - 1

En outputstrøm er som en printer. Vi kan udskrive dokumenter til printeren. Vi kan udlæse data til en outputstrøm.

På sin side kan en inputstrøm sammenlignes med en scanner eller måske en stikkontakt. Med en scanner kan vi bringe dokumenter ind på vores computer. Eller vi kan slutte til en stikkontakt og modtage strøm fra den. Vi kan modtage data fra en inputstrøm.

"Hvor bruges de?"

"Disse klasser bruges overalt i Java. Vores velkendte ven System.in er en statisk InputStream -variabel navngivet i System - klassen."

"Seriøst?! Så al denne tid har jeg brugt en InputStream og var ikke engang klar over det. Er System.out også en stream?"

"Ja, System.out er en statisk PrintStream (en efterkommer af OutputStream ) variabel i System-klassen."

"Du mener at fortælle mig, at jeg altid har brugt streams og ikke engang vidste det?"

"Ja, og det fortæller os bare, hvor praktiske disse streams er. Du skal bare tage en og bruge den."

"Men det kan man ikke sige om System.in. Vi var konstant nødt til at tilføje BufferedReader eller InputStreamReader til det."

"Det er rigtigt. Men det var der også grunde til."

Der er mange datatyper og mange måder at arbejde med dem på. Så antallet af standard I/O klasser voksede meget hurtigt, selvom de gjorde alting på næsten samme måde. For at undgå denne kompleksitet brugte Java-udviklere abstraktionsprincippet og opdelte klasser i mange små dele.

Men du kan forbinde disse dele på en sammenhængende måde og få meget kompleks funktionalitet, hvis du har brug for det. Se på dette eksempel:

Udskriv en streng til konsollen
System.out.println("Hello");
Gem konsoludgangsstrømmen i en separat variabel.
Udskriv en streng til strømmen.
PrintStream console = System.out;
console.println("Hello");
Opret et dynamisk (udvidende) byte-array i hukommelsen.
Tilslut den til en ny udgangsstrøm (PrintStream-objekt).
Udskriv en streng til strømmen.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

"Helt ærligt, det er ligesom et Lego-sæt. Bare det er ikke klart for mig, hvad nogen af ​​denne kode gør."

"Du skal ikke bekymre dig om det for nu. Alt til sin egen tid."

Dette er, hvad jeg vil have dig til at huske: Hvis en klasse implementerer OutputStream-grænsefladen, kan du skrive bytes til den. Næsten præcis som du udsender data til konsollen. Hvad den gør med den er dens sag. Med vores "Lego kit" er vi ligeglade med formålet med hver enkelt del. Vi bekymrer os om, at det store udvalg af dele lader os bygge så fede ting.

"Okay. Hvor skal vi så begynde?"