Kezdő Olvasási idő: ~4 perc

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/Writer pá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