Kimeneti adatfolyamok

All lectures for HU purposes
Szint , Lecke
Elérhető

1. OutputStreamosztály

Nemrég fedeztük fel a bemeneti adatfolyamokat. Ideje beszélni a kimeneti adatfolyamokról.

Az OutputStreamosztá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 OutputStreamosztá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
void write(int b)
Egy bájtot (nem egy ) ír inta folyamba.
void write(byte[] buffer)
Egy bájttömböt ír az adatfolyamba
void write(byte[] buffer, off, len)
Egy bájttömb egy részét írja az adatfolyamba
void flush()
A pufferben tárolt összes adatot a folyamba írja
void close()
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 InputStreamadatokat 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 OutputStreamosztály összes metódusát:

write(int b)módszer

Ez a metódus egy bájtot (nem egy) ír inta 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 lengtha 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
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreamfá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. Writerosztály

Az Writerosztály pontosan ugyanaz, mint az osztály, de még egyszer csak egy különbség: bájtok helyett OutputStreamkarakterekkel ( ) 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.

WriterAz osztály (és az összes leszármazott osztály) módszerei :

Mód Leírás
void write(int b)
Egy karaktert (nem egy ) ír intaz adatfolyamba.
void write(char[] buffer)
Karaktertömböt ír az adatfolyamba
void write(char[] buffer, off, len)
Egy karaktertömb egy részét írja az adatfolyamba
void write(String str)
Karakterláncot ír az adatfolyamba
void write(String str, off, len)
Egy karakterlánc egy részét írja az adatfolyamba
void flush()
A pufferben tárolt összes adatot a folyamba írja
void close()
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 offsetváltozó a tömb első elemének indexét jelöli, és lengthaz í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 offsetváltozó a tömb első elemének indexét jelöli, és lengthaz í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
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readerfá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

StringWriterosztály

Van még egy érdekes osztály, amely örökli az Writerosztályt: az úgynevezett StringWriter. Tartalmaz egy változtatható karakterláncot – egy StringBufferobjektumot. É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 writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
StringWriterLé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 StringWriterosztály lényegében az osztály feletti burkoló StringBuffer, de az StringWriterosztály a stream osztály leszármazottja Writer, és folyam objektumok láncaiban használható. Ez egy nagyon hasznos tulajdonság a gyakorlatban.



3. PrintStreamosztá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:

PrintStream osztály

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 PrintStreamosztály örökli az FilterOutputStreamosztályt, amely örökli OutputStream. Ez azt jelenti, hogy az PrintStreamosztá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
void print(obj)
Az átadott objektumot karakterláncsá alakítja, és kiadja a célfolyamba.
void println(obj)
Az átadott objektumot karakterláncsá alakítja, és kiadja a célfolyamba. Sortörést ad a végére
void println()
Sortörés karaktert ad ki a célfolyamba
PrintStream format(String format, args...)
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
PrintStream stream = System.out;
stream.println("Hello!");
Hello!

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()outSystemPrintStream

Sok CodeGym szinten és szinte minden feladatban az osztály metódusait hívtad meg PrintStreamané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 ByteArrayOutputStreamobjektum és PrintStreamobjektum a következőképpen láncolható:

Kód Leírás
ByteArrayOutputStream baos = new ByteArrayOutputStream();

try(PrintStream stream = new PrintStream(baos))
{
   stream.println("Hello");
   stream.println(123);
}

String result = baos.toString();

System.out.println(result);
Hozzon létre írási puffert a memóriában.

Csomagolja be a puffert egy PrintStreamobjektumba

Írja be az adatokat a konzolba



Alakítsa át a tömböt stringgé!

Konzol kimenet:
Hello!
123

Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION