1. OutputStream
osztály
Nemrég fedeztük fel a bemeneti adatfolyamokat. Ideje beszélni a kimeneti adatfolyamokról.
Az OutputStream
osztály minden olyan osztály szülőosztálya, amely támogatja a bájtkimenetet. Ez egy absztrakt osztály, amely önmagában nem csinál semmit, de minden alkalomra vannak leszármazottai.
Rendkívül bonyolultan hangzik. Egyszerűbben fogalmazva, ez az osztály bájtokkal működik, és nem például karakterekkel vagy más adattípusokkal. Az pedig, hogy elvont, azt jelenti, hogy általában nem használjuk, hanem az egyik leszármazott osztályát. Például FileOutputStream
és hasonlók.
De vissza az OutputStream
osztályhoz. Ennek az osztálynak vannak olyan metódusai, amelyeket az összes leszármazott osztályának implementálnia kell. Íme a főbbek:
Mód | Leírás |
---|---|
|
Egy bájtot (nem egy ) ír int a folyamba. |
|
Egy bájttömböt ír az adatfolyamba |
|
Egy bájttömb egy részét írja az adatfolyamba |
|
A pufferben tárolt összes adatot a folyamba írja |
|
Bezárja a patakot |
Amikor olyan osztály objektumát hoz létre, amely örökli a InputStream
, akkor általában megad egy forrásobjektumot, amelyből az InputStream
adatokat olvassa be. Amikor olyan osztály objektumát hoz létre, amely örökli a -t OutputStream
, általában meg kell adnia azt a célobjektumot vagy adatfolyamot is, amelybe az adatok íródnak.
Nézzük meg röviden az OutputStream
osztály összes metódusát:
write(int b)
módszer
Ez a metódus egy bájtot (nem egy) ír int
a kimeneti adatfolyamba. Az átadott érték egy bájtba kerül, és az int első három bájtja eldobásra kerül.
write(byte[] buffer)
módszer
A megadott bájttömböt írja a kimeneti adatfolyamba. Ez az.
write(byte[] buffer, int offset, int length)
módszer
Az átadott bájttömb egy részét a kimeneti adatfolyamba írja. Az offset változó a tömb első elemének indexét jelöli, és length
a megírandó részhalmaz hosszát.
flush()
módszer
A flush()
módszer arra szolgál, hogy az aktuális adatfolyamban esetlegesen pufferolt adatokat a céladatfolyamba írják. Ez akkor releváns, ha pufferelést és/vagy több, láncba rendezett adatfolyamobjektumot használ.
close()
módszer
Minden íratlan adatot a célobjektumra ír. A close()
metódust nem kell meghívni, ha blokkot használ try-with-resources
.
Példa egy fájl másolására
Kód | jegyzet |
---|---|
|
InputStream fájlból való olvasáshoz fájlba OutputStream íráshoz Puffer, amelybe beolvassuk az adatokat Amíg van adat a folyamban Adatok olvasása a pufferbe Írja az adatokat a pufferből a második adatfolyamba |
2. Writer
osztály
Az Writer
osztály pontosan ugyanaz, mint az osztály, de még egyszer csak egy különbség: bájtok helyett OutputStream
karakterekkel ( ) működik .char
Ez egy absztrakt osztály: nem hozhat létre objektumokat az osztályból Writer
. Fő célja, hogy több száz leszármazott osztály közös szülőosztálya legyen, és közös metódusokat adjon nekik a karakterfolyamokkal való munkához.
Writer
Az osztály (és az összes leszármazott osztály) módszerei :
Mód | Leírás |
---|---|
|
Egy karaktert (nem egy ) ír int az adatfolyamba. |
|
Karaktertömböt ír az adatfolyamba |
|
Egy karaktertömb egy részét írja az adatfolyamba |
|
Karakterláncot ír az adatfolyamba |
|
Egy karakterlánc egy részét írja az adatfolyamba |
|
A pufferben tárolt összes adatot a folyamba írja |
|
Bezárja a patakot |
A metódusok nagyon hasonlóak az osztály metódusaihoz OutputStream
, de bájtok helyett karakterekkel működnek.
A módszerek leírása:
write(int b)
módszer
Ez a metódus egyetlen karaktert ( char
— nem an int
) ír a kimeneti adatfolyamba. Az átadott érték egy -be kerül char
, és az első két bájt eldobásra kerül.
write(char[] buffer)
módszer
A megadott karaktertömböt írja a kimeneti adatfolyamba.
write(char[] buffer, int offset, int length)
módszer
Az átadott karaktertömb egy részét a kimeneti adatfolyamba írja. A offset
változó a tömb első elemének indexét jelöli, és length
az írandó részhalmaz hosszát.
write(String str)
módszer
A megadott karakterláncot beírja a kimeneti adatfolyamba.
write(String str, int offset, int length)
módszer
A megadott karakterlánc egy részét beírja a kimeneti adatfolyamba: a karakterláncot karaktertömbbé alakítja. A offset
változó a tömb első elemének indexét jelöli, és length
az írandó részhalmaz hosszát.
flush()
módszer
A flush()
módszer arra szolgál, hogy az aktuális adatfolyamban esetlegesen pufferolt adatokat a céladatfolyamba írják. Ez akkor releváns, ha pufferelést és/vagy több, láncba rendezett adatfolyamobjektumot használ.
close()
módszer
Minden íratlan adatot a célobjektumra ír. A close()
metódust nem kell meghívni, ha blokkot használ try-with-resources
.
Példa egy szöveges fájlt másoló programra:
Kód | jegyzet |
---|---|
|
Reader fájlból való olvasáshoz fájlba Writer íráshoz Puffer, amelybe beolvassuk az adatokat Amíg van adat a folyamban Adatok olvasása pufferbe Írja az adatokat a pufferből a második adatfolyamba |
StringWriter
osztály
Van még egy érdekes osztály, amely örökli az Writer
osztályt: az úgynevezett StringWriter
. Tartalmaz egy változtatható karakterláncot – egy StringBuffer
objektumot. És minden alkalommal, amikor "ír" valamit az objektumra StringWriter
, a szöveg egyszerűen hozzáadódik a belső pufferéhez.
Példa:
Kód | jegyzet |
---|---|
|
StringWriter Létrejön egy célkarakterfolyam ( ) Egy karakterláncot írnak a pufferbe a karakterláncon belül StringWriter A karakterláncot írják a pufferbe StringWriter egy objektum tartalmának sztringgé konvertálása |
Ebben az esetben az StringWriter
osztály lényegében az osztály feletti burkoló StringBuffer
, de az StringWriter
osztály a stream osztály leszármazottja Writer
, és folyam objektumok láncaiban használható. Ez egy nagyon hasznos tulajdonság a gyakorlatban.
3. PrintStream
osztály
A kimeneti adatfolyam osztályok láncba is helyezhetők közvetítő folyamokkal, amelyek adatokat írnak a nekik átadott célfolyamba. Az adatfolyamok interakciójának általános képe a következőképpen néz ki:
Az összes köztes kimeneti adatfolyam közül a legérdekesebb és legsokoldalúbb a PrintStream
. Több tíz módszerrel és akár 12 konstruktorral rendelkezik.
Az PrintStream
osztály örökli az FilterOutputStream
osztályt, amely örökli OutputStream
. Ez azt jelenti, hogy az PrintStream
osztály a saját metódusain kívül a szülőosztályok összes metódusával rendelkezik . Íme a legérdekesebbek:
Mód | Leírás |
---|---|
|
Az átadott objektumot karakterláncsá alakítja, és kiadja a célfolyamba. |
|
Az átadott objektumot karakterláncsá alakítja, és kiadja a célfolyamba. Sortörést ad a végére |
|
Sortörés karaktert ad ki a célfolyamba |
|
A formázási karakterlánc és az átadott argumentumok alapján egy karakterláncot szerkeszt és ad ki; String.format() módszeréhez hasonló |
És hol van ez a több tíz módszer, kérdezed?
Nos, számos változata van a print()
és println()
módszereknek különböző paraméterekkel. Ezeket ebben a táblázatban lehet összefoglalni.
Nem merülünk el ezekben a módszerekben, mert Ön már jól ismeri őket. Kitalálod, mire gondolok?
Emlékszel System.out.println()
? De két sorba írható:
Kód | Konzol kimenet |
---|---|
|
|
Kedvenc parancsunk a metódus hívása az osztály statikus változóján . És ennek a változónak a típusa .System.out.println()
println()
out
System
PrintStream
Sok CodeGym szinten és szinte minden feladatban az osztály metódusait hívtad meg PrintStream
anélkül, hogy tudtad volna!
Gyakorlati használat
A Java-nak van egy érdekes osztálya ByteArrayOutputStream
, ami egy dinamikusan növekvő bájttömb, amely örökli OutputStream
.
Egy ByteArrayOutputStream
objektum és PrintStream
objektum a következőképpen láncolható:
Kód | Leírás |
---|---|
|
Hozzon létre írási puffert a memóriában. Csomagolja be a puffert egy PrintStream objektumba Írja be az adatokat a konzolba Alakítsa át a tömböt stringgé! Konzol kimenet:
|
GO TO FULL VERSION