Régi IO (java.io)
InputStream, OutputStream, Reader, Writer és pufferelés
Régi IO (java.io)
A klasszikus java.io stream és character alapú absztrakciókat ad bájtok és szöveg kezelésére.
1. Definíció
A klasszikus I/O a java.io csomag stream alapú API-ja, ahol a bájtfolyamokat InputStream/OutputStream, a karakteralapú szöveget pedig Reader/Writer kezeli. Interjún ez alap, mert innen érthető meg a pufferelés, az erőforráskezelés és a szöveg vs bináris adat különbsége.
A téma kapcsolódik fájlolvasáshoz, hálózati adatkezeléshez és régi Java API-khoz. Még ha modern kódban gyakran NIO-t használsz is, a klasszikus réteg továbbra is sok helyen jelen van.
2. Alapfogalmak
| Fogalom | Jelentés | Miért fontos |
|---|---|---|
InputStream |
Bájtok olvasása | Bináris adatforrások alap absztrakciója. |
OutputStream |
Bájtok írása | Bináris kimenetek alapja. |
Reader |
Karakterek olvasása | Charset dekódolással dolgozik. |
Writer |
Karakterek írása | Szöveges kimenethez hasznos. |
| Buffered wrapper | Pufferelt réteg, pl. BufferedInputStream |
Kevesebb rendszerhívást és jobb teljesítményt ad. |
- A bájt és karakter API-kat ne keverd össze gondolkodás nélkül: szöveg esetén fontos a charset.
- A stream dekorátor mintát használ: egy streamet gyakran több wrapperbe csomagolsz.
- A pufferelés jelentősen csökkentheti az I/O hívások számát.
- A
flush()szerepe írásnál fontos, főleg buffered writer vagy hálózati kimenet esetén.
3. Gyakorlati használat
A(z) Régi IO (java.io) témában a legfontosabb gyakorlati kérdés mindig az, hogy milyen use-case-re választasz eszközt. A jó interjúválasz itt nem csak azt mondja meg, mit lehet csinálni, hanem azt is, mikor érdemes és mikor nem.
- Bináris fájlhoz vagy protokollhoz használj streamet, szöveghez inkább
Reader/Writerpárost. - Mindig adj meg charsetet, ha szöveget olvasol/írsz, például UTF-8-at.
- Preferáld a try-with-resources mintát, mert I/O esetén a resource leak gyakori hiba.
- Interjún említsd meg, hogy a pufferelt wrapper általában default jó választás.
4. Kód példák
Egyszerű példa
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
public class ReaderExample {
public static void main(String[] args) throws IOException {
try (BufferedReader reader = new BufferedReader(new StringReader("hello\njava"))) {
System.out.println(reader.readLine());
}
}
}
Haladó példa
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class WriterExample {
public static void main(String[] args) throws IOException {
try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
out.write("Hello IO".getBytes(StandardCharsets.UTF_8));
out.flush();
}
}
}
A kódpéldák interjún azért hasznosak, mert megmutatják, hogy a fogalmi szintű tudást le tudod fordítani konkrét API-használatra. Ha röviden el tudod magyarázni, miért így írod a példát, az általában többet ér, mint egy túlbonyolított demo.
5. Trade-offok
| Szempont | Előny | Hátrány |
|---|---|---|
| Byte stream | Jó bináris adatokhoz | Szövegnél neked kell charsetről gondoskodni |
| Character stream | Kényelmesebb szöveghez | Nem ideális nyers bináris adathoz |
| Buffered wrapper | Gyorsabb gyakorlati I/O | Van plusz buffer memória és flush szemantika |
6. Gyakori hibák
- ❌ Rossz: Default charsetre hagyatkozol. ✅ Helyes: Adj meg explicit charsetet, például UTF-8-at.
- ❌ Rossz: Elfelejted lezárni a streamet. ✅ Helyes: Használj try-with-resources-t.
- ❌ Rossz: Reader helyett byte streamet használsz szöveghez magyarázat nélkül. ✅ Helyes: Szöveghez karakteres API jobb, mert kezeli a dekódolást.
7. Senior szintű meglátások
Senior nézőpontból a klasszikus I/O megértése azért fontos, mert sok magasabb szintű könyvtár még mindig erre épül. Ha tudod, mi történik a stream lánc alatt, könnyebb teljesítményt és hibát diagnosztizálni.
Follow-up interjúkérdés: mikor kell flush()? Nem minden close() előtt kötelező külön, de hosszú életű kimenetnél vagy hálózatnál számíthat.
A charset hibák tipikusan környezetfüggő bugokat okoznak, ezért senior szinten az explicit encoding szinte reflex.
Tipikus follow-up interjúkérdések:
- Hogyan magyaráznád el röviden a(z) Régi IO (java.io) témát egy junior fejlesztőnek?
- Milyen trade-offot látsz a(z) Régi IO (java.io) kapcsán valós projektben?
- Milyen tipikus production hibát tudsz ehhez a témához kötni?
A gyakorlatban a klasszikus IO hibáinak jelentős része nem maga az API, hanem a rossz rétegezés: nincs explicit charset, nincs buffering, vagy elmarad a zárás. Interjún kifejezetten erős válasz, ha ki tudod mondani, hogy a helyes absztrakció kiválasztása mellett az erőforrás-életciklus és a platformfüggetlen szövegkezelés a két legnagyobb kockázati pont.
Ez az a téma, ahol a kis részletek – például egy rossz charset vagy egy kimaradt flush – később nagyon drága production hibává tudnak nőni.
8. Szószedet
| Kifejezés | Jelentés |
|---|---|
| stream | Adatfolyam absztrakció olvasáshoz vagy íráshoz. |
| reader | Karakteralapú bemenet kezelője. |
| writer | Karakteralapú kimenet kezelője. |
| buffering | Adatok ideiglenes gyűjtése kevesebb I/O hívásért. |
| charset | A bájtok és karakterek közti kódolási szabály. |
9. Gyorsreferencia
- Bináris adat:
InputStream/OutputStream. - Szöveg:
Reader/Writer. - Adj meg explicit charsetet.
- Használj buffered wrappert teljesítményhez.
- Zárd erőforrást try-with-resources-szel.
Ha interjún elakadsz, a(z) Régi IO (java.io) témánál mindig térj vissza a három alapelvhez: pontos definíció, tipikus use-case, és a legfontosabb trade-off vagy hiba.
🎮 Játékok
8 kérdés