Sobes.tech
Middle

Ինչպես են կառուցված Input և Output հոսքերը Java-ում?

sobes.tech AI

Պատասխան AI-ից

Ներմուծման և արտածման հոսքերը Java-ում ներկայացնում են տվյալների աղբյուրի (ներմուծման համար) և ստացողի (արտածման համար) աբստրակտ ներկայացումներ։ Նրանք մաս են կազմում java.io փաթեթի:

Հիմնական դասերը՝

  • InputStream: Բազային աբստրակտ դաս՝ բայթների ընթերցման համար։
  • OutputStream: Բազային աբստրակտ դաս՝ բայթների գրելու համար։
  • Reader: Բազային աբստրակտ դաս՝ նշանների ընթերցման համար։
  • Writer: Բազային աբստրակտ դաս՝ նշանների գրելու համար։

Աշխատանք բայթների և նշանների հետ՝

  • Հոսքերը (InputStream, OutputStream) աշխատում են բայթների հետ։
  • Readers և Writers աշխատում են նշանների հետ՝ օգտագործելով կոդավորումը (օրինակ՝ UTF-8)՝ բայթները նշանների և հակառակը փոխելու համար։

Հիմնական հասկացություններ՝

  1. Զարդարիչ (Wrapper) դիզայնի օրինակ: Շատ հոսքեր դասեր են, որոնք "զարդարում" են այլ հոսքեր՝ ավելացնելու ֆունկցիոնալություն (օրինակ՝ բուֆերավորում, տվյալների սեղմում, տիպերի փոխակերպում)։ Օրինակ՝ BufferedInputStream-ը զարդարում է այլ InputStream։

  2. Կանոնավոր մուտք: Տվյալները հոսքում ընթերցվում կամ գրանցվում են հերթականությամբ։

  3. Հոսքերի փակումը: Կարևոր է, որ հոսքերը փակվեն օգտագործումից հետո՝ համակարգային ռեսուրսները ազատելու համար (ֆայլային դեսկրիպտորներ, ցանցային կապեր)։ Սովորաբար օգտագործվում է try-with-resources:

    // Օրինակ՝ try-with-resources օգտագործելու
    try (InputStream is = new FileInputStream("file.txt")) {
        int data = is.read();
        while (data != -1) {
            // Տվյալների մշակումը
            data = is.read();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  4. Կարդալու/գրելու մեթոդներ՝

    • read(): Կարդում է մեկ բայթ կամ նշան, կամ վերադարձնում -1՝ վերջում։
    • read(byte[] b): Կարդում է բայթեր՝ b զանգվածում։ Վերադարձնում է ընթերցված բայթերի քանակը կամ -1։
    • read(byte[] b, int off, int len): Կարդում է մինչև len բայթ՝ off տեղաշարժով՝ b զանգվածում։
    • Նույնպես՝ write() մեթոդներ՝ գրելու համար։

Կատարյալ օրինակներ հոսքերի/Readers/Writers կոնկրետ իրականացման համար՝

  • FileInputStream/FileOutputStream: Ֆայլերի հետ աշխատելու համար։
  • ByteArrayInputStream/ByteArrayOutputStream: Բայթների հետ աշխատելու համար հիշողության մեջ։
  • PipedInputStream/PipedOutputStream: Տվյալների փոխանակում մեկ գործընթացի մեջ՝ հոսքերի միջև։
  • SocketInputStream/SocketOutputStream: Նետային կապերի համար։
  • BufferedReader/BufferedWriter: Բուֆերային ընթերցում/գրելու համար՝ կատարողականությունը բարելավելու համար։
  • InputStreamReader/OutputStreamWriter: Բայթային հոսքերը նշանների փոխարկման համար։

Դասերի հիերարխիա՝

  • InputStream
    • FileInputStream
    • BufferedInputStream
    • ObjectInputStream (սերիալիզացիայի համար)
    • ...
  • OutputStream
    • FileOutputStream
    • BufferedOutputStream
    • ObjectOutputStream (սերիալիզացիայի համար)
    • ...
  • Reader
    • FileReader
    • BufferedReader
    • InputStreamReader
    • ...
  • Writer
    • FileWriter
    • BufferedWriter
    • OutputStreamWriter
    • ...

Ընտրությունը՝ բայթային կամ նշանային հոսքերի միջև՝ կախված տվյալների տեսակից՝ բայթային՝ բինար տվյալների համար (նկարներ, գործարկվող ֆայլեր), նշանային՝ տեքստային տվյալների համար։