Sobes.tech
Middle

Ako sú v Jave navrhnuté Input a Output Streamy?

sobes.tech AI

Odpoveď od AI

Vstupné a výstupné prúdy v Jave predstavujú abstraktné reprezentácie zdroja (pre vstup) a príjemcu (pre výstup) dát. Sú súčasťou balíka java.io.

Hlavné triedy:

  • InputStream: Základná abstraktná trieda na čítanie bajtov.
  • OutputStream: Základná abstraktná trieda na zápis bajtov.
  • Reader: Základná abstraktná trieda na čítanie znakov.
  • Writer: Základná abstraktná trieda na zápis znakov.

Práca s bajtami a znakmi:

  • Prúdy (InputStream, OutputStream) pracujú s bajtmi.
  • Readers a Writers pracujú so znakmi, používajúc kódovanie (napríklad UTF-8) na prevod bajtov na znaky a späť.

Kľúčové koncepty:

  1. Dekorátor (Wrapper) vzor: Mnohé triedy prúdov sú "dekorátory", ktoré obalujú iné prúdy na pridanie funkčnosti (napríklad buffering, kompresia dát, prevod typov). Napríklad, BufferedInputStream obalí iný InputStream.

  2. Sekvenciálny prístup: Dáta v prúde sa čítajú alebo zapisujú sekvenčne.

  3. Zatváranie prúdov: Je dôležité zatvárať prúdy po použití na uvoľnenie systémových zdrojov (súborové deskriptory, sieťové spojenia). Často sa používa try-with-resources:

    // Príklad použitia try-with-resources
    try (InputStream is = new FileInputStream("file.txt")) {
        int data = is.read();
        while (data != -1) {
            // Spracovanie dát
            data = is.read();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  4. Metódy čítania/zápisu:

    • read(): Číta jeden bajt (alebo znak) alebo vracia -1 na konci prúdu.
    • read(byte[] b): Číta bajty do poľa b. Vráti počet prečítaných bajtov alebo -1.
    • read(byte[] b, int off, int len): Číta do len bajtov s posunom off v poli b.
    • Podobné metódy write() na zápis.

Príklady konkrétnych implementácií prúdov/Readerov/Writers:

  • FileInputStream/FileOutputStream: Na prácu so súbormi.
  • ByteArrayInputStream/ByteArrayOutputStream: Na prácu s bajtmi v pamäti.
  • PipedInputStream/PipedOutputStream: Na výmenu dát medzi prúdmi v jednom procese.
  • SocketInputStream/SocketOutputStream: Na sieťové spojenia.
  • BufferedReader/BufferedWriter: Na bufferovanie čítania/zápisu, čo zlepšuje výkon.
  • InputStreamReader/OutputStreamWriter: Na prevod bajtových prúdov na znaky a späť.

Hierarchia tried:

  • InputStream
    • FileInputStream
    • BufferedInputStream
    • ObjectInputStream (pre serializáciu)
    • ...
  • OutputStream
    • FileOutputStream
    • BufferedOutputStream
    • ObjectOutputStream (pre serializáciu)
    • ...
  • Reader
    • FileReader
    • BufferedReader
    • InputStreamReader
    • ...
  • Writer
    • FileWriter
    • BufferedWriter
    • OutputStreamWriter
    • ...

Voľba medzi bajtovými a znakmi prúdmi závisí od typu dát: bajty pre binárne dáta (obrázky, spustiteľné súbory), znaky pre textové dáta.