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 objektumhoz 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.