Jelenlegi hely

20.1. Adatfolyamok

Információ kinyeréséhez a program megnyit egy adatfolyamot az információforráshoz (fájl, memória, socket), és sorban kiolvassa az információt, amint az ábrán látszik:

Olvasás fájlból

Hasonlóképpen, egy program külső célba is küldheti az információkat adatfolyam megnyitásával, és információkat írhat ki sorban, mint itt:

Fájlba írás

Nem számít, mekkora adat jön be, vagy megy ki, és nem számít a típusa, az algoritmus sorban olvassa és írja, a következőköz hasonlóan:

Olvasás

adatfolyam megnyitása
amíg van újabb információ
    olvasás
adatfolyam bezárása

Írás

adatfolyam megnyitása
amíg van újabb információ
    írás
adatfolyam bezárása

A java.io csomag tartalmazza azon osztályokat, melyek lehetővé teszik az írást és olvasást. Az osztályok használatához importálni kell a java.io csomagot.

Az adatfolyam osztályok két hierarchiára oszthatók az adattípusuk alapján (karakter vagy bájt):

Adattípusok

Karakter folyamok

Reader és Writer a java.io absztrakt ősosztályai. 16 bites karakterekkel való műveleteket teszik lehetővé. A Reader és Writer leszármazott osztályai speciális műveleteket végeznek, és két külön kategóriára oszthatók: az adat olvasás és írás (szürkével jelezve) és feldolgozások végrehajtása (fehérek). Az utóbbiakat szűrő folyamoknak is nevezzük. A Reader és Writer osztályok osztályhierarchiáját mutatja az ábra.

A Reader osztály

A Writer osztály

A legtöbb programnak szüksége van a Reader és Writer osztályokra szöveges információk olvasásához és írásához. Ezek bármilyen karaktert képes lekezelni Unicode karakterként.

Bináris folyamok

A 8-bites bájt írásához és olvasásához a programnak használnia kell a bináris folyamokat, melyek az InputStream és OutputStream leszármazottai. Ezek a folyamok jellemzően bináris adatok olvasására és írására alkalmasak, mint egy kép vagy hang. A bájt folyam két osztálya, ObjectInputStream és ObjectOutputStream használható objektumok soros folyamon keresztüli kezeléshez.

Az InputStream és OutputStream osztályok a Reader és Writer osztályokhoz hasonlóan két kategóriára oszthatók, a következő osztályhierarchia alapján: adatkezelő folyamok (szürke) és feldolgozó vagy más néven szűrő folyamok (fehér).

InputStream osztály

OutputStream osztály

Az I/O szülőosztályok

Reader és InputStream azonos API-kat határoznak meg, de különböző adattípusra. A Reader metódusai karakterek és karaktertömbök olvasására alkalmasak:

int read()
int read(char cbuf[])
int read(char cbuf[], int offset, int length)

Az InputStream hasonló metódusai bináris adatok és tömbök olvasására alkalmasak:
int read()
int read(byte cbuf[])
int read(byte cbuf[], int offset, int length)

A Reader és InputStream is megvalósítja az adatfolyamon belüli állapot jelölését, ugrálást, és az aktuális pozíció visszaállítását.

A Writer és OutputStream hasonló szolgáltatásokkal rendelkeznek. A Writer karakterek, és karaktertömbök írását valósítja meg:

int write(int c)
int write(char cbuf[])
int write(char cbuf[], int offset, int length)

Az OutputStream azonos metódusú de bináris adatra:
int write(int c)
int write(byte cbuf[])
int write(byte cbuf[], int offset, int length)

Mind a négy osztály esetén igaz, hogy automatikusan megnyílik az adatfolyam, ha létre van hozva az objektum. Minden adatfolyam bezárható a close meghívásával. A szemétgyűjtő is bezárja, ha már nincs rá hivatkozás, de célszerű inkább direkt módon meghívni a close metódust.

Megjegyezés: A program „kötelessége”, hogy minden erőforrást csak a ténylegesen szükséges ideig foglaljon le. Éppen ezért az állomány megnyitását olyan későn kell megtenni, amikor csak lehet, és ugyanilyen hamar be is kell zárni.

Az adatfolyam osztályok használata

A táblázat a java.io adatfolyamokat és feladatuk leírását tartalmazza.

I/O típus Osztályok Leírás
Memória CharArrayReader
CharArrayWriter

ByteArrayInputStream
ByteArrayOutputStream

Az adatfolyamok kiolvasásra és a memóriába írására használható. Az adatfolyamok létrehozhatók egy meglévő tömbbel, és az olvasást és írást használva kiolvas és a tömbbe ír.
StringReader
StringWriter

StringBufferInputStream

A StringReader karaktereket olvas a memóriából. A StringWriter egy String-be ír. A StringWriter kiírandó karaktereket gyűjt egy StringBuffer-be, ami String-be konvertál.

StringBufferInputStream hasonló a StringReader-hez, kivéve, hogy egy StringBuffer-ből karaktereket olvas.

Cső PipedReader
PipedWriter

PipedInputStream
PipedOutputStream

A bemenet és kimenet között valósít meg egy összekötő csövet. A csövek a kimenettől a másik bemenetig tartó folyamot valósítanak meg.
Fájl FileReader
FileWriter

FileInputStream
FileOutputStream

Együttesen fájl folyamoknak hívják, melyekkel fájlból olvashatunk, vagy fájlba írhatunk.
Lánc SequenceInputStream Több bemenet adatfolyamainak összefűzése egy bemeneti adatfolyamba
Objektum sorosítása ObjectInputStream
ObjectOutputStream
Objektumok soros szervezésű tárolásához és visszaállításához.
Adat konverzió DataInputStream
DataOutputStream
Primitív adattípusok írása és olvasá-sa gépfüggetlen formátumban
Számláló LineNumberReader
LineNumberInputStream
Nyomon követhető a sorok száma olvasáskor.
Előre olvasás PushbackReader

PushbackInputStream

A bemeneti adatfolyamok egy vissza-tehető pufferbe kerülnek. Az adatok olvasásakor néha hasznos a következő néhány bájt vagy karakter ismerete a következő lépés eldöntéséhez.
Kinyomtatás PrintWriter

PrintStream

Nyomtatási metódusokat tartalmaz. Az adatfolyamok tartalmának kiíratására használható.
Pufferelés BufferedReader
BufferedWriter

BufferedInputStream
BufferedOutputStream

Olvasáskor és íráskor az adatok pufferelődnek, ezáltal csökkentve a forrás adat eléréseinek számát. A pufferelt adatfolyamok hatékonyabbak, mint a nem pufferelt adatfolyamok, és gyakran használhatók más adatfolyamokkal is.
Szűrés FilterReader
FilterWriter

FilterInputStream
FilterOutputStream

Ezek az absztrakt osztályok a szűrő adatfolyamok vázát adják meg, milyen szűrés használható íráskor vagy olvasáskor.
Bájtok és karakterek közti konverzió InputStreamReader

OutputStreamWriter

Az olvasó és író páros hidat képez a bájt és a karakterfolyamok között.

Az InputStreamReader bájtokat olvas egy InputStream-ből és karakterbe konvertálja, az alapértelmezett karakterkódolást vagy egy megnevezett karakterkódolást használva.

Az OutputStreamWriter karaktereket konvertál bájtba, az alapértelmezett karakterkódolást vagy egy meg-nevezett karakterkódolást használva és a bájtokat egy OutputStream-be írja.