Sobes.tech
Middle

Hogyan épülnek fel az Input és Output Stream-ek Java-ban?

sobes.tech MI

Válasz az MI-től

A Java bemeneti és kimeneti áramlatai absztrakt reprezentációk az adatok forrására (bemenet esetén) és fogadójára (kimenet esetén). A java.io csomag részei.

Főbb osztályok:

  • InputStream: Alapvető absztrakt osztály bájtok olvasására.
  • OutputStream: Alapvető absztrakt osztály bájtok írására.
  • Reader: Alapvető absztrakt osztály karakterek olvasására.
  • Writer: Alapvető absztrakt osztály karakterek írására.

Bájtokkal és karakterekkel való munka:

  • Az áramlások (InputStream, OutputStream) bájtokkal dolgoznak.
  • A Reader és Writer osztályok karakterekkel dolgoznak, kódolást (pl. UTF-8) használva a bájtok karakterekké való átalakítására és fordítva.

Kulcsfogalmak:

  1. Dekorátor (Wrapper) minta: Sok áramlás osztály "dekoraor", amelyek más áramlásokat vesznek körül funkcionalitás hozzáadásához (pl. pufferelés, adat tömörítés, típusátalakítás). Például, a BufferedInputStream egy másik InputStream-et vesz körül.

  2. Szekvenciális hozzáférés: Az adatok az áramlásban egymás után olvashatók vagy írhatók.

  3. Áramlások zárása: Fontos, hogy az áramlásokat lezárjuk használat után a rendszer erőforrásainak felszabadítása érdekében (fájl leírók, hálózati kapcsolatok). Gyakran használják a try-with-resources-t:

    // Példa a try-with-resources használatára
    try (InputStream is = new FileInputStream("file.txt")) {
        int data = is.read();
        while (data != -1) {
            // Adatok feldolgozása
            data = is.read();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  4. Olvasási/írási módszerek:

    • read(): Egy byte-ot (vagy karaktert) olvas, vagy -1-et ad vissza a végén.
    • read(byte[] b): Byte-okat olvas a b tömbbe. Visszaadja az olvasott byte-ok számát vagy -1-et.
    • read(byte[] b, int off, int len): Legfeljebb len byte-ot olvas a b tömbbe a off eltolással.
    • Hasonló write() módszerek az íráshoz.

Konkrét példák áramlások/Reader-ek/Writer-ek implementációjára:

  • FileInputStream/FileOutputStream: Fájlok kezelésére.
  • ByteArrayInputStream/ByteArrayOutputStream: Byte-ok kezelésére memóriában.
  • PipedInputStream/PipedOutputStream: Adatok cseréje folyamaton belüli áramlások között.
  • SocketInputStream/SocketOutputStream: Hálózati kapcsolatokhoz.
  • BufferedReader/BufferedWriter: Bufferelés olvasáshoz/íráshoz, ami javítja a teljesítményt.
  • InputStreamReader/OutputStreamWriter: Byte-áramok karakterekké való átalakítására és fordítva.

Osztályhierarchia:

  • InputStream
    • FileInputStream
    • BufferedInputStream
    • ObjectInputStream (sorozatba rendezéshez)
    • ...
  • OutputStream
    • FileOutputStream
    • BufferedOutputStream
    • ObjectOutputStream (sorozatba rendezéshez)
    • ...
  • Reader
    • FileReader
    • BufferedReader
    • InputStreamReader
    • ...
  • Writer
    • FileWriter
    • BufferedWriter
    • OutputStreamWriter
    • ...

A választás bájt- vagy karakteralapú áramlások között a adat típusától függ: bájtokat bináris adatokhoz (képek, futtatható fájlok), karaktereket szöveges adatokhoz.