"Szia, Amigo! Ma az input/output streamekkel ismerkedünk meg . Pár napja válogattunk ehhez a témához, de ma alaposan körbejárjuk. Az input/output streameket 4 kategóriába soroljuk:"

1) Az adatfolyamokat irányuk szerint osztjuk fel: bemeneti és kimeneti adatfolyamok

2) Az adatfolyamokat adattípusuk szerint osztják fel: azok, amelyek bájtokkal és karakterekkel működnek .

Itt ezek a felosztások táblázatban vannak ábrázolva:

Bemeneti adatfolyam Kimeneti adatfolyam
Bájtokkal működik InputStream OutputStream
Karakterekkel működik Olvasó Író

Ha egy objektum megvalósítja az InputStream interfészt, akkor támogatja a bájtok szekvenciális olvasását belőle.

Ha egy objektum megvalósítja az OutputStream interfészt, akkor támogatja a bájtok egymás utáni írásának lehetőségét.

Ha egy objektum megvalósítja a Reader interfészt, akkor támogatja a karakterek (karakterek) szekvenciális olvasását belőle.

Ha egy objektum megvalósítja a Writer interfészt, akkor támogatja a karakterek (karakterek) egymás utáni írását.

Bemeneti/kimeneti adatfolyamok – 1

A kimeneti adatfolyam olyan, mint egy nyomtató. A dokumentumokat ki tudjuk nyomtatni a nyomtatóra. Az adatokat kimeneti adatfolyamba tudjuk kiadni.

A bemeneti adatfolyam a maga részéről egy szkennerhez vagy esetleg egy elektromos aljzathoz hasonlítható. Szkennerrel tudjuk a dokumentumokat a számítógépünkre vinni. Vagy bedughatjuk egy konnektorba, és kaphatunk onnan áramot. Adatokat fogadhatunk bemeneti adatfolyamból.

– Hol használják?

"Ezeket az osztályokat mindenhol használják a Java-ban. Ismerős barátunk, a System.in egy statikus InputStream változó, amelyet a System osztályban neveznek el ."

"Komolyan?! Szóval egész idő alatt egy InputStream-et használtam, és nem is vettem észre. A System.out is adatfolyam?"

"Igen, a System.out egy statikus PrintStream (az OutputStream leszármazottja ) változó a System osztályban."

– Azt akarod mondani, hogy mindig is streameket használtam, és nem is tudtam?

"Igen, és ez csak azt mutatja meg, mennyire kényelmesek ezek az adatfolyamok. Csak fogj egyet, és használd."

"De ezt nem mondhatja el a System.in-ről. Folyamatosan hozzá kellett adnunk a BufferedReader-t vagy az InputStreamReader-t."

– Ez igaz. De ennek okai is voltak.

Nagyon sok adattípus létezik, és sokféleképpen lehet velük dolgozni. Így a szabványos I/O osztályok száma nagyon gyorsan nőtt, bár szinte ugyanúgy csináltak mindent. Ennek a bonyolultságnak a elkerülése érdekében a Java fejlesztők az absztrakció elvét alkalmazták, és az osztályokat sok kis részre osztották.

De ezeket az alkatrészeket koherens módon csatlakoztathatja, és nagyon összetett funkciókat kaphat, ha szüksége van rá. Nézd meg ezt a példát:

Írjon ki egy karakterláncot a konzolra
System.out.println("Hello");
Tárolja a konzol kimeneti adatfolyamát egy külön változóban.
Írjon ki egy karakterláncot az adatfolyamba.
PrintStream console = System.out;
console.println("Hello");
Hozzon létre egy dinamikus (bővülő) bájttömböt a memóriában.
Csatlakoztassa egy új kimeneti adatfolyamhoz (PrintStream objektum).
Írjon ki egy karakterláncot az adatfolyamba.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

"Őszintén szólva, ez olyan, mint egy Lego készlet. Csak számomra nem világos, hogy ez a kód mit csinál."

"Egyelőre ne aggódj emiatt. Mindent a maga idejében."

Ezt szeretném, ha ne feledje: Ha egy osztály megvalósítja az OutputStream felületet, akkor bájtokat írhat rá. Majdnem pontosan úgy, ahogyan adatokat adsz ki a konzolra. Hogy mit csinál vele, az az ő dolga. A "Lego készletünkkel" nem törődünk az egyes alkatrészek rendeltetésével. Törődünk azzal, hogy a nagy alkatrészválaszték lehetővé teszi, hogy ilyen klassz dolgokat készítsünk.

"Rendben. Akkor hol kezdjük?"