Sprievodca programom Java OutputStream

1. Prehľad

V tomto tutoriále preskúmame podrobnosti o triede Java OutputStream. OutputStream je abstraktná trieda. Toto slúži ako nadtrieda pre všetky triedy predstavujúca výstupný tok bajtov.

Postupne preskúmame, čo znamenajú tieto slová ako „výstup“ a „prúd“.

2. Stručný úvod do Java IO

OutputStream je súčasťou Java IO API ktorá definuje triedy potrebné na vykonávanie I / O operácií v Jave. Všetky sú balené v java.io menný priestor. Toto je jeden z hlavných balíkov dostupných v Jave od verzie 1.0.

Počnúc Java 1.4 máme v priestore mien pribalenú aj Java NIO java.nio ktorý umožňuje neblokujúce vstupné a výstupné operácie. Našou zameranou oblasťou pre tento článok však je ObjectStream ako súčasť Java IO.

Podrobnosti týkajúce sa Java IO a Java NIO nájdete tu.

2.1. Vstup a výstup

Java IO v zásade poskytuje mechanizmus na čítanie údajov zo zdroja a na ich zápis do cieľového miesta. Vstup predstavuje zdroj, zatiaľ čo výstup predstavuje cieľ.

Tieto zdroje a ciele môžu byť čokoľvek, od súborov, potrubí až po sieťové pripojenia.

2.2. Prúdy

Java IO poskytuje koncept prúdy, čo v zásade predstavuje nepretržitý tok údajov. Streamy môžu podporovať veľa rôznych typov údajov, ako sú bajty, znaky, objekty atď.

Stream navyše predstavuje pripojenie k zdroju alebo cieľu. Preto pochádzajú ako buď InputStream alebo OutputStream resp.

3. Rozhrania OutputStream

OutputStream implementuje množstvo rozhraní, ktoré poskytujú svojim podtriedam výrazný charakter. Poďme si nimi rýchlo prejsť.

3.1. Uzatvárateľné

Rozhranie Uzatvárateľné poskytuje metódu s názvom Zavrieť() ktoré spracováva uzavretie zdroja alebo cieľa dát. Každá implementácia OutputStream musí zabezpečiť implementáciu tejto metódy. Tu môžu vykonávať akcie na uvoľnenie zdrojov.

3.2. Automatické uzatváranie

Rozhranie Automatické uzatváranie tiež poskytuje metódu tzv Zavrieť() s podobným správaním ako ten v Uzatvárateľné. V tomto prípade však metóda Zavrieť() sa automaticky zavolá pri ukončení bloku try-with-resource.

Viac podrobností týkajúcich sa vyskúšania zdrojov nájdete tu.

3.3. Splachovacie

Rozhranie Splachovacie poskytuje metódu s názvom spláchnuť() ktorý spracováva vyprázdňovanie údajov do cieľa.

Konkrétna implementácia OutputStream sa môže rozhodnúť vyrovnať predtým napísané bajty na optimalizáciu, ale hovor na spláchnuť() umožňuje okamžité zapísanie do cieľa.

4. Metódy v OutputStream

OutputStream má niekoľko metód, ktoré musí každá implementujúca trieda implementovať pre svoje príslušné dátové typy.

Tieto sú na rozdiel od Zavrieť() a spláchnuť() metódy, z ktorých dedí Uzatvárateľné a Splachovacie rozhrania.

4.1. napíš (int b)

Túto metódu môžeme použiť na napíš jeden konkrétny bajt do OutputStream. Pretože argument „int“ obsahuje štyri bajty, ako par kontrakt sa napíše iba prvý bajt nižšej objednávky a zvyšné tri bajty vysokej objednávky sa ignorujú:

public static void fileOutputStreamByteSingle (reťazcový súbor, reťazcové údaje) vyvolá IOException {byte [] bytes = data.getBytes (); try (OutputStream out = new FileOutputStream (file)) {out.write (bytes [6]); }}

Ak túto metódu nazveme „Hello World!“, Výsledkom bude súbor s nasledujúcim textom:

Ž

Ako vidíme, toto je siedmy znak reťazca indexovaného ako šiesty.

4.2. zápis (bajt [] b, int vypnutý, int dĺžka)

Táto preťažená verzia napíš () metóda je tu zapíše podsekvenciu bajtového poľa do OutputStream.

Môže zapísať „dĺžka“ počtu bajtov z bajtového poľa tak, ako je určené argumentom, začínajúcim s posunom určeným „vypnuté“ do Výstupný prúd:

public static void fileOutputStreamByteSubSequence (reťazcový súbor, reťazcové údaje) hodí IOException {byte [] bytes = data.getBytes (); try (OutputStream out = new FileOutputStream (file)) {out.write (bytes, 6, 5); }}

Ak teraz zavoláme túto metódu s rovnakými údajmi ako predtým, do výstupného súboru dostaneme nasledujúci text:

Svet

Toto je podreťazec našich údajov, ktorý začína na indexe päť a obsahuje päť znakov.

4.3. zápis (bajt [] b)

Toto je ďalšia preťažená verzia servera napíš () metóda, ktorá môže napísať celé bajtové pole ako je uvedené v argumente k OutputStream.

To má rovnaký účinok ako volanie na číslo write (b, 0, b.lengh):

public static void fileOutputStreamByteSequence (String file, String data) throws IOException {byte [] bytes = data.getBytes (); try (OutputStream out = new FileOutputStream (file)) {out.write (bytes); }}

Keď teraz zavoláme túto metódu s rovnakými údajmi, máme celú String v našom výstupnom súbore:

Ahoj Svet!

5. Priame podtriedy OutputStream

Teraz si povieme niečo o priamych známych podtriedach OutputStream ktoré jednotlivo predstavujú konkrétny dátový typ, z ktorého OutputStream definujú.

Definujú svoje vlastné metódy okrem implementácie tých, ktoré boli zdedené OutputStream.

Nebudeme zachádzať do podrobností o týchto podtriedach.

5.1. FileOutputStream

Ako už názov napovedá, a FileOutputStream je an OutputStream zapisovať dáta do a Súbor. FileOutputStream, ako každý iný OutputStream, môže písať prúd nespracovaných bajtov.

V roku sme už preskúmali rôzne metódy FileOutputStream ako súčasť poslednej časti.

5.2. ByteArrayOutputStream

ByteArrayOutputStream je implementácia OutputStream ktoré môžu zapisovať údaje do bajtového poľa. Pufr rastie ako ByteArrayOutputStream zapisuje doň údaje.

Môžeme ponechať predvolenú počiatočnú veľkosť medzipamäte ako 32 bajtov alebo nastaviť konkrétnu veľkosť pomocou jedného z dostupných konštruktorov.

Tu je dôležité poznamenať, že táto metóda Zavrieť() nemá prakticky žiadny účinok. Ostatné metódy v ByteArrayOutputStream sa dá bezpečne volať aj potom Zavrieť() bol volaný.

5.3. FilterOutputStream

OutputStream primárne zapisuje bajtový prúd do cieľa, ale predtým môže tiež transformovať údaje. FilterOutputStream predstavuje nadtrieda všetkých týchto tried, ktoré vykonávajú špecifickú transformáciu údajov. FilterOutputStream je vždy konštruovaný s existujúcim OutputStream.

Niektoré z príkladov FilterOutputStreamBufferedOutputStream, CheckedOutputStream, CipherOutputStream, DataOutputStream, DeflaterOutputStream, DigestOutputStream, InflaterOutputStream, PrintStream.

5.4. ObjectOutputStream

ObjectOutputStream môcť písať primitívne dátové typy a grafy Java objektov na miesto určenia. Môžeme zostrojiť ObjectOutputStream pomocou existujúceho OutputStream zapisovať do konkrétneho cieľa, napríklad do súboru.

Upozorňujeme, že je potrebné, aby sa objekty implementovali Serializovateľné pre ObjectOutputStream napísať ich na miesto určenia. Viac podrobností o serializácii Java nájdete tu.

5.5. PipedOutputStream

A PipedOutputStream je užitočné vytvoriť komunikačné potrubie. PipedOutputStream môže zapisovať dáta, ktoré sú pripojené PipedInputStream vie čítať.

PipedOutputStream obsahuje konštruktor na jeho spojenie s a PipedInputStream. Prípadne to môžeme urobiť neskôr pomocou metódy uvedenej v PipedOutputStream zavolal pripojiť ().

6. OutputStream Ukladanie do vyrovnávacej pamäte

Vstupné a výstupné operácie zvyčajne zahŕňajú relatívne drahé operácie, ako je prístup na disk, sieťová aktivita atď. Takéto vykonávanie môže často spôsobiť, že program bude menej efektívny.

Na zvládnutie týchto scenárov máme v Jave „medzipamäťové prúdy“ údajov. BufferedOutputStreamnamiesto toho zapisuje údaje do medzipamäte, ktorá sa do cieľového miesta vyprázdňuje menej často, keď sa vyrovnávacia pamäť zaplní, alebo metóda spláchnuť() sa volá.

BufferedOutputStream predlžuje FilterOutputStream skôr diskutované a zalamuje existujúce OutputStream napísať do cieľa:

public static void bufferedOutputStream (reťazcový súbor, reťazec ... dáta) vyvolá IOException {try (BufferedOutputStream out = nový BufferedOutputStream (nový FileOutputStream (súbor))) {pre (String s: data) {out.write (s.getBytes () ); out.write ("" .getBytes ()); }}}

Kritickým bodom, ktorý je potrebné poznamenať, je, že každé volanie na číslo napíš () pre každý údajový argument sa zapisuje iba do medzipamäte a nevedie k potenciálne nákladnému volaniu do súboru.

V prípade uvedenom vyššie, ak túto metódu zavoláme s údajmi ako „Hello“, „World!“, Bude to mať za následok iba zápis údajov do súboru, až keď kód opustí blok try-with-resources, ktorý metódu volá. Zavrieť() na BufferedOutputStream.

Výsledkom je výstupný súbor s nasledujúcim textom:

Ahoj Svet!

7. Písanie textu pomocou OutputStreamWriter

Bajtový prúd, ako už bolo uvedené vyššie, predstavuje nespracované údaje, ktoré môžu predstavovať veľa textových znakov. Teraz môžeme získať pole znakov a vykonať prevod na bajtové pole sami:

byte [] bytes = data.getBytes ();

Java poskytuje pohodlné triedy na preklenutie tejto medzery. Pre prípad OutputStream, táto trieda je OutputStreamWriter. OutputStreamWriter zavinuje OutputStream a môže priamo písať znaky na požadované miesto určenia.

Môžeme tiež voliteľne poskytnúť OutputStreamWriter so znakovou sadou na kódovanie:

public static void outputStreamWriter (String file, String data) throws IOException {try (OutputStream out = new FileOutputStream (file); Writer writer = new OutputStreamWriter (out, "UTF-8")) {writer.write (data); }}

Teraz, ako vidíme, nemusíme pred použitím vykonať transformáciu znakového poľa na bajtové pole FileOutputStream.OutputStreamWriter robí to pre nás pohodlne.

Nie je prekvapením, že keď vyššie uvedenú metódu zavoláme s údajmi ako „Hello World!“, Výsledkom bude súbor s textom ako:

Ahoj Svet!

8. Záver

V tomto článku sme diskutovali o abstraktnej triede Java OutputStream. Prešli sme si rozhraniami, ktoré implementuje, a metódami, ktoré poskytuje.

Potom sme diskutovali o niektorých podtriedach OutputStream k dispozícii v prostredí Java. Nakoniec sme hovorili o ukladaní do vyrovnávacej pamäte a prúdoch postáv.

Ako vždy, kód príkladov je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found