Útmutató a Java OutputStreamhez

1. Áttekintés

Ebben az oktatóanyagban a Java osztály részleteit tárjuk fel OutputStream. OutputStream egy elvont osztály. Ez szolgál az összes osztály szuperosztálya, amely egy bájt kimeneti áramot jelent.

Megvizsgáljuk, mit jelentenek ezek a szavak, mint például a „kimenet” és a „folyam”, részletesebben, ahogy haladunk.

2. A Java IO rövid bemutatása

Az OutputStream a Java IO API része amely meghatározza a Java I / O műveletek végrehajtásához szükséges osztályokat. Ezek mind a java.io névtér. Ez az egyik alapvető csomag, amely az 1.0 verzió óta elérhető a Java-ban.

A Java 1.4-től kezdve a névtérbe csomagolva van a Java NIO is java.nio amely lehetővé teszi a nem blokkoló bemeneti és kimeneti műveleteket. Ennek a cikknek a középpontja azonban az ObjectStream a Java IO részeként.

A Java IO-val és a Java NIO-val kapcsolatos részletek itt találhatók.

2.1. Bemenet és kimenet

A Java IO alapvetően biztosítja mechanizmus az adatok forrásból történő kiolvasására és adatok írására a rendeltetési helyre. Az Input a forrást, míg a output itt a rendeltetési helyet jelöli.

Ezek a források és célok bármi lehetnek, a Fájlok, a Csövek és a Hálózati kapcsolatok között.

2.2. Patakok

A Java IO a adatfolyamok, amelyek alapvetően folyamatos adatáramlást jelentenek. Az adatfolyamok sokféle adatot támogathatnak, például bájtokat, karaktereket, objektumokat stb.

Ezenkívül a forráshoz vagy a célhoz való kapcsolódás az, amit egy adatfolyam jelent. Ezért ők is úgy jönnek InputStream vagy OutputStream illetőleg.

3. Interfészei OutputStream

OutputStream egy csomó interfészt valósít meg, amelyek bizonyos külön karaktert kölcsönöznek az alosztályainak. Gyorsan menjünk át rajtuk.

3.1. Bezárható

Az interfész Bezárható nevű módszert biztosít Bezárás() melyik kezeli az adatok forrásának vagy céljának bezárását. Minden megvalósítása OutputStream biztosítania kell ennek a módszernek a megvalósítását. Itt végezhetnek műveleteket az erőforrások felszabadítása érdekében.

3.2. Automatikusan zárható

Az interfész Automatikusan zárható nevű módszert is nyújt Bezárás() hasonló viselkedéssel Bezárható. Ebben az esetben azonban a módszer Bezárás() automatikusan meghívásra kerül, amikor kilép egy erőforrás-próbálkozás blokkból.

Az erőforrással való próbálkozásról itt talál további részleteket.

3.3. Öblíthető

Az interfész Öblíthető nevű módszert biztosít öblítés () amely az öblítési adatokat kezeli egy rendeltetési helyre.

A OutputStream választhatja a korábban írt bájtok pufferelését az optimalizálás érdekében, de felhívás öblítés () azonnal megírja a rendeltetési helyre.

4. Módszerek az OutputStreamben

OutputStream többféle módszerrel rendelkezik, amelyeket minden egyes implementációs osztálynak meg kell valósítania a saját adattípusaihoz.

Ezek külön vannak Bezárás() és öblítés () módszerek, amelyeket örököl Bezárható és Öblíthető interfészek.

4.1. ír (int b)

Használhatjuk ezt a módszert írjon egy konkrét bájtot a OutputStream. Mivel az „int” argumentum négy bájtból áll, a szerződés értelmében csak az első alacsony sorrendű bájt íródik, a fennmaradó három magas sorrendű bájt pedig figyelmen kívül marad:

public static void fileOutputStreamByteSingle (Karakterláncfájl, Stringadatok) IOException-t dob ​​{byte [] bytes = data.getBytes (); try (OutputStream out = új FileOutputStream (fájl)) {out.write (byte [6]); }}

Ha ezt a módszert az adatokkal „Hello World!” -Nek nevezzük, akkor a következő szöveget tartalmazó fájlt kapjuk:

W

Ez, amint láthatjuk, a hatodik indexelt karakterlánc hetedik karaktere.

4.2. ír (bájt [] b, int ki, int hossz)

Ez a túlterhelt verzió a ír() módszer van írjon a bájt tömb részsorozatát a OutputStream.

Írni képes a „byte” hosszúságú bájtok számát a bájt tömbből, amint azt az argumentum meghatározza, az „off” által meghatározott eltolással kezdve a OutputStream:

public static void fileOutputStreamByteSubSequence (String file, String data) dobja az IOException {byte [] bytes = data.getBytes (); próbáld ki (OutputStream out = new FileOutputStream (file)) {out.write (byte, 6, 5); }}

Ha most ezt a módszert ugyanazokkal az adatokkal hívjuk meg, mint korábban, akkor a következő szöveget kapjuk a kimeneti fájlunkban:

Világ

Ez az öt indexből kiinduló és öt karakterből álló adataink szubsztrátja.

4.3. ír (bájt [] b)

Ez még egy túlterhelt verziója a ír() módszer, amely lehet írj egy teljes bájt tömböt amint azt az argumentum a OutputStream.

Ennek ugyanaz a hatása, mint a hívásnak írjon (b, 0, b.lengh):

public static void fileOutputStreamByteSequence (String file, String data) dobja az IOException {byte [] bytes = data.getBytes (); próbáld ki (OutputStream out = new FileOutputStream (file)) {out.write (byte); }}

Amikor most ugyanazokkal az adatokkal hívjuk ezt a módszert, akkor megvan az egész Húr a kimeneti fájlunkban:

Helló Világ!

5. A közvetlen alosztályai OutputStream

Most megvitatjuk a közvetlenül ismert alosztályokat OutputStream amelyek egyenként képviselnek egy adott adattípust, amelynek a OutputStream meghatározzák.

Meghatározzák saját módszereiket, kivéve az örökölt módszereket OutputStream.

Nem foglalkozunk ezen alosztályok részleteivel.

5.1. FileOutputStream

Ahogy a neve is mutatja, a FileOutputStream van an OutputStream adatokat írni a File. FileOutputStream, mint bármely más OutputStream, írhat egy nyers bájtfolyamot.

A különböző módszereket már megvizsgáltuk FileOutputStream az utolsó szakasz részeként.

5.2. ByteArrayOutputStream

ByteArrayOutputStream egy végrehajtása OutputStream amely képes adatokat írni egy bájt tömbbe. A puffer folyamatosan növekszik ByteArrayOutputStream adatokat ír hozzá.

Megtarthatjuk a puffer alapértelmezett kezdeti méretét 32 bájtként, vagy beállíthatunk egy adott méretet a rendelkezésre álló konstruktorok egyikével.

Itt fontos megjegyezni, hogy a módszer Bezárás() gyakorlatilag nincs hatása. A többi módszer a ByteArrayOutputStream után is nyugodtan hívható Bezárás() hívták.

5.3. FilterOutputStream

Az OutputStream elsősorban egy bájtfolyamot ír egy célállomáshoz, de ezt megelőzően az adatokat is átalakíthatja. FilterOutputStream képviseli minden olyan osztály szuperosztálya, amely specifikus adattranszformációt hajt végre. FilterOutputStream mindig egy létezővel épül fel OutputStream.

Néhány példa a FilterOutputStream vannak BufferedOutputStream, CheckedOutputStream, CipherOutputStream, DataOutputStream, DeflaterOutputStream, DigestOutputStream, InflaterOutputStream, PrintStream.

5.4. ObjectOutputStream

ObjectOutputStream tud írjon primitív adattípusokat és grafikonokat a Java objektumokról rendeltetési helyre. Felépíthetünk egy ObjectOutputStream meglévő felhasználásával OutputStream hogy egy adott címzetthez írjon, például File.

Felhívjuk figyelmét, hogy az objektumok megvalósításához szükséges Sorosítható mert ObjectOutputStream hogy megírja őket egy rendeltetési helyre. A Java-szerializálásról itt talál további részleteket.

5.5. PipedOutputStream

A PipedOutputStream van hasznos kommunikációs cső létrehozásához. PipedOutputStream tud írni olyan adatokat, amelyek csatlakoztatva vannak PipedInputStream tud olvasni.

PipedOutputStream tartalmaz egy konstruktort, amely összeköti a PipedInputStream. Alternatív megoldásként ezt később is megtehetjük az itt megadott módszer használatával PipedOutputStream hívott connect ().

6. OutputStream Pufferelés

A be- és kimeneti műveletek általában viszonylag költséges műveleteket foglalnak magukban, mint például a lemezelérés, a hálózati tevékenység stb. Ennek végrehajtása gyakran a program kevésbé hatékony.

Ezeknek a forgatókönyveknek a kezelésére „pufferelt adatfolyamokat” biztosítunk a Java-ban. BufferedOutputStreamadatot ír egy pufferbe, amely ritkábban kerül át a célállomásra, amikor a puffer megtelik, vagy a módszer öblítés () nak, nek hívják.

BufferedOutputStream kiterjed FilterOutputStream korábban megbeszélték, és egy létezőt becsomagol OutputStream hogy írjon egy úticélra:

public static void bufferedOutputStream (String file, String ... data) dobja az IOException-t {try (BufferedOutputStream out = new BufferedOutputStream (new FileOutputStream (file))) {for (String s: data) {out.write (s.getBytes () ); out.write ("" .getBytes ()); }}}

A kritikus szempont, hogy minden hívás ír() minden adat argumentum csak a pufferbe ír, és nem eredményez potenciálisan drága hívást a fájlba.

A fenti esetben, ha ezt a módszert "Hello", "World!" Névvel hívjuk meg, akkor ez csak azt eredményezi, hogy az adatok a fájlba kerülnek, amikor a kód kilép a metódust meghívó try-with-resources blokkból. Bezárás() a BufferedOutputStream.

Ez egy kimeneti fájlt eredményez a következő szöveggel:

Helló Világ!

7. Szöveg írása OutputStreamWriter

A korábban tárgyalt bájtfolyam a nyers adatokat jelöli, amelyek egy rakás szövegkaraktert tartalmazhatnak. Most megszerezhetjük a karakter tömböt, és mi magunk hajthatjuk végre az átalakítást a bájt tömbbe:

bájt [] bájt = data.getBytes ();

A Java kényelmes osztályokat kínál e rés áthidalására. Esetében OutputStream, ez az osztály az OutputStreamWriter. OutputStreamWriter pakol egy OutputStream és közvetlenül írhat karaktereket a kívánt rendeltetési helyre.

Opcionálisan megadhatjuk a OutputStreamWriter a kódoláshoz használt karakterkészlettel:

public static void outputStreamWriter (String fájl, String adatok) dobja az IOException {try (OutputStream out = new FileOutputStream (fájl); Writer író = new OutputStreamWriter (out, "UTF-8")) {író.írja (adatok); }}

Most, mint láthatjuk, a használat előtt nem kell végrehajtanunk a karaktertömb átalakítását bájttömbökké FileOutputStream.OutputStreamWriter ezt kényelmesen elvégzi helyettünk.

Nem meglepő, hogy amikor a fenti módszert olyan adatokkal hívjuk meg, mint a „Hello World!”, Akkor ez egy fájlba kerül, amelynek szövege a következő:

Helló Világ!

8. Következtetés

Ebben a cikkben megvitattuk a Java absztrakt osztályt OutputStream. Végignéztük az általa megvalósított interfészeket és az általa biztosított módszereket.

Majd megbeszéltük a OutputStream elérhető Java-ban. Végül a pufferelésről és a karakterfolyamokról beszélgettünk.

Mint mindig, a példák kódja elérhető a GitHub oldalon.