Sobes.tech
Middle

Kuidas on Java-s üles ehitatud Input ja Output Streamid?

sobes.tech AI

Vastus AI-lt

Input ja Output streamid Java's on abstrakts kujutis andmeallikast (Input jaoks) ja vastuvõtjast (Output jaoks) andmete jaoks. Nad kuuluvad java.io paketti.

Peamised klassid:

  • InputStream: Põhiklass baitide lugemiseks.
  • OutputStream: Põhiklass baitide kirjutamiseks.
  • Reader: Põhiklass märkide lugemiseks.
  • Writer: Põhiklass märkide kirjutamiseks.

Töö baitide ja märkidega:

  • Struumid (InputStream, OutputStream) töötavad baitidega.
  • Readers ja Writers töötavad märkidega, kasutades kodeeringut (näiteks UTF-8), et teisendada baitid märkideks ja tagasi.

Põhimõisted:

  1. Dekoratiivne (Wrapper) muster: Paljud struumiklassid on "dekoratsioonid", mis ümbritsevad teisi struumisid, et lisada funktsionaalsust (näiteks buferimine, andmete tihendamine, tüüpide teisendamine). Näiteks BufferedInputStream ümbritseb teist InputStream.

  2. Järjepidev juurdepääs: Andmed struumis loetakse või kirjutatakse järjepidevalt.

  3. Struumide sulgemine: Oluline on struumid sulgeda pärast kasutamist, et vabastada süsteemi ressursid (faili deskriptorid, võrguliidesed). Sageli kasutatakse try-with-resources:

    // Näide try-with-resources kasutamisest
    try (InputStream is = new FileInputStream("file.txt")) {
        int data = is.read();
        while (data != -1) {
            // Andmete töötlemine
            data = is.read();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  4. Lugemis-/kirjutusmeetodid:

    • read(): Loeb ühe baiti (või märgi) või tagastab -1 lõpus.
    • read(byte[] b): Loeb baitid massiivi b. Tagastab loetud baitide arvu või -1.
    • read(byte[] b, int off, int len): Loeb kuni len baiti, alustades indeksist off massiivis b.
    • Sarnased write() meetodid kirjutamiseks.

Näited konkreetsetest struumidest/Readeritest/Writersitest:

  • FileInputStream/FileOutputStream: Failidega töötamiseks.
  • ByteArrayInputStream/ByteArrayOutputStream: Baitidega töötamiseks mälus.
  • PipedInputStream/PipedOutputStream: Andmete vahetamiseks struumide vahel samas protsessis.
  • SocketInputStream/SocketOutputStream: Võrguühenduste jaoks.
  • BufferedReader/BufferedWriter: Buferiseeritud lugemis- ja kirjutamiskiiruse parandamiseks.
  • InputStreamReader/OutputStreamWriter: Baitide voogude teisendamiseks märkideks ja tagasi.

Klasside hierarhia:

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

Straumide baitide ja märkide valik sõltub andmetüübist: baitide jaoks sobivad binaarsed andmed (pildid, täidetavad failid), märkide jaoks tekstilised andmed.