1. InputStreamReader
osztály
A streamek másik érdekes tulajdonsága, hogy több adatfolyamot láncokká kombinálhat . Egy adatfolyam nem csak a belső adatforrásából, hanem egy másik adatfolyamból is képes adatokat olvasni .
Ez egy nagyon hatékony mechanizmus a Java-ban, amely lehetővé teszi összetett adatolvasási forgatókönyvek létrehozását az egyik adatfolyam és a másik összekapcsolásával. Egy ilyen séma így néz ki:
Amikor egy program adatokat olvas ki egy adatfolyamból, az adatfolyam viszont az adatforrásból olvassa be az adatokat, amely például egy másik adatfolyam vagy egy fájl.
Ráadásul az egyes adatfolyamok nemcsak beolvasnak és kiadnak adatokat, hanem átalakíthatják azokat, vagy különféle műveleteket hajthatnak végre rajta. Jó példa egy ilyen "köztes folyamra" az InputStreamReader
osztály.
Már ismerünk egy osztályt FileReader
– ez egy olyan osztály Reader
, amely egy fájlból olvas adatokat. És honnan InputStreamReader
veszik az adatokat? Így van – egy InputStream
.
Objektum létrehozásakor InputStreamReader
át kell adnia egy InputStream
objektumot vagy annak egyik leszármazott osztályát. Példa:
String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);
Az InputStreamReader
osztályban az összes metódus megtalálható Reader
, és pontosan ugyanúgy működnek.
A fő különbség az InputStreamReader
osztály és mondjuk FileReader
az, hogy honnan olvasnak adatokat. FileReader
beolvassa az adatokat egy fájlból (duh - ezért hívják FileReader
), de InputStreamReader
olvas adatokat egy InputStream
.
FileReader
Amikor a metódussal beolvas egy karaktert egy objektumból read()
, az viszont beolvas két bájtot a lemezen lévő fájlból, és ként adja vissza őket chars
.
InputStreamReader
Amikor a metódus segítségével beolvas egy karaktert egy objektumból read()
, az viszont két bájtot olvas be a FileInputStream
neki átadott objektumból, ami viszont adatokat olvas be a fájlból. Az eredmény metódushívások láncolataread()
.
2. BufferedReader
osztály
Egy másik érdekes osztály, amelyet valószínűleg sokat fogsz használni, a BufferedReader
. Ez is egy "köztes adatfolyam", amely egy másik adatfolyamból olvas adatokat.
Ahogy a neve is sugallja, az BufferedReader
osztály egy alosztálya Reader
, és lehetővé teszi a karakterek olvasását . A legérdekesebb azonban az, hogy egy adatforrást is át kell adni neki egy adatfolyam formájában, amelyből a karakterek kiolvashatók , azaz egy adatfolyamot, amely örökli az Reader
osztályt.
Mi az értelme? Ellentétben a -val InputStreamReader
, az BufferedReader
osztály nem alakítja át a bájtokat karakterekké: egyáltalán nem konvertál semmit. Ehelyett puffereli az adatokat .
Amikor egy program egyetlen karaktert olvas be egy objektumból BufferedReader
, az objektum egyszerre egy nagy karaktertömböt olvas ki a forrásfolyamból. És belül tárolja őket.
Amikor a következő karaktert kiolvassák az BufferedReader
objektumból, egyszerűen megragadja a következő karaktert a belső puffertömbjéből, és visszaadja anélkül, hogy hozzáférne az adatforráshoz. Csak ha a pufferben lévő összes karakter elhasználódott, akkor a karakterek egy másik nagy tömbje olvasható be.
Az BufferedReader
osztálynak van egy nagyon hasznos metódusa is – String readLine()
, amely lehetővé teszi, hogy egyszerre teljes adatsort olvasson ki a forrásfolyamból. Ezzel a módszerrel például beolvashatunk egy fájlt, és soronként megjeleníthetjük annak tartalmát a képernyőn. Példa:
Külön írtunk néhány kompakt kódot, amely bemutatja, milyen kényelmes lehet ez. Ezt a kódot kicsit részletesebben is meg lehetne írni.
|
Hozzon létre egy FileReader objektumot. Az adatforrás egy fájl. Hozzon létre egy BufferedReader objektumot. Az adatforrás egy FileReader . Amíg van még adat az olvasóban Egy sor olvasása Jelenítse meg a sort |
Ha több adatfolyamot láncol össze, akkor a close()
metódust csak az egyiken kell meghívni. Ez az adatfolyam meg fogja hívni a metódust az adatforrásában, és így tovább, amíg close()
meg nem hívják a végső adatfolyamon.
3. Olvasás a konzolról
És még egy érdekesség: az Scanner
osztály nem más, mint egy közbenső bemeneti folyam, amely a -ból olvas adatokat System.in
, ami szintén adatfolyam.
Kétféleképpen olvashat ki egy sort a konzolról:
Szkenner osztály | BufferedReader és BufferedWriter osztályok |
---|---|
|
|
A barátunk nem más, mint az osztály statikus változója . Ez egy, akinek a neve .System.in
in
System
InputStream
in
Tehát szinte a CodeGym-en végzett Java-tanulmányaid kezdetétől fogva adatfolyamokkal dolgozol, és láncokat építesz belőlük. De most tudatosabban fogod csinálni.
GO TO FULL VERSION