Fluxuri de prelucrare

Fluxurile de prelucrare se conectează la alte fluxuri de intrare/ieșire pentru a face anumite transformări asupra datelor din fluxul respectiv. Clasele de fluxuri de prelucrare din Java API au fost prezentate pe scurt la descrierea pachetului java.io. În această secțiune ne vom ocupa de două categorii de fluxuri de prelucrare: fluxurile de date și fluxurile de obiecte.

Fluxuri de date

În unele aplicații se dorește să se transmită într-un flux de ieșire sau să se recepționeze dintr-un flux de intrare date primitive reprezentate binar (de tip boolean, char, byte, short, int, long, float sau double) și șiruri de caractere. În acest scop, pot fi folosite clasele java.io.DataOutputStream și java.io.DataInputStream.Se pot citi cu un DataInputStream numai date care au fost scrise cu un DataOutputStream.
 
Instanțele acestor clase nu sunt fluxuri de intrare/ieșire propriu-zise, ci fluxuri de prelucrare. În consecință, ele nu se conectează direct la sursă sau la destinație, ci la alte fluxuri. Astfel, ieșirea unui DataOutputStream se poate conecta la intrarea unui FileOutputStream, ByteArrayOutputStream sau PipedOutputStream. Se poate conecta, de asemenea la intrarea unui BufferedOutputStream care, la rândul lui, este conectat la oricare din cele trei menționate anterior. În mod similar, intrarea unui DataInputStream poate fi conectată la ieșirea unui FileInputStream, ByteArrayInputStream sau PipedInputStream.

Clasa DataOutputStream

Clasa java.io.DataOutputStream este derivată din clasa java.io.FilterOutputStream și implementează interfața java.io.DataOutput. Ea  permite să se transmită date primitive către un flux de ieșire într-o formă portabilă (independentă de platformă), cu condiția ca aceste date să fie citite ulterior printr-un DataInputStream.
 
Constructor:
    public DataOutputStream(OutputStream out) - creează un nou flux de ieșire de date, conectat la ieșire la un OutputStream (adică la o instanță a unei clase derivate din clasa OutputStream). 

Metode:
Aceasta clasă conține metodele clasei java.io.OutputStream, la care se adaugă următoarele metode specifice, destinate scrierii în fluxul de ieșire a datelor primitive sau a unor șiruri de caractere: 

    public final void writeBoolean(boolean v) throws IOException - scrie o valoare booleană; 
    public final void writeChar(char v) throws IOException - scrie o valoare de tip char, în format Unicode; 
    public final void writeByte(byte v) throws IOException - scrie o valoare de tip byte pe un octet; 
    public final void writeShort(short v) throws IOException - scrie o valoare de tip short pe doi octeți; 
    public final void writeInt(int v) throws IOException - scrie o valoare de tip int pe 4 octeți; 
    public final void writeLong(long v) throws IOException - scrie o valoare de tip long pe 8 octeți; 
    public final void writeFloat(float v) throws IOException - scrie o valoare de tip float pe 4 octeți; 
    public final void writeDouble(double v) throws IOException - scrie o valoare de tip double pe opt octeți; 
    public final void writeBytes(String v) throws IOException - scrie un șir de caractere, convertit într-un șir de octeți prin suprimarea octetului superior al fiecărui caracter; 
    public final void writeChars(String v) throws IOException - scrie în flux un șir de caractere (în Unicode); 
    public final void writeUTF(String v) throws IOException - scrie un șir de caractere codificat în formatul UTF-8 într-o formă independentă de mașină (se scrie mai întâi lungimea șirului pe doi octeți, apoi fiecare caracter din șir pe câte un singur octet); 
    public final int size() - întoarce numărul de octeți scriși în acest flux de ieșire. 

Clasa DataInputStream

Un DataInputStream este un flux de intrare de octeți care este conectat la intrare la un alt InputStream și citeste din acesta date primitive într-o formă independentă de platformă. Se pot citi cu DataInputStream numai date care au fost scrise cu DataOutputStream.

Clasa java.io.DataInputStream este derivată din clasa java.io.FilterInputStream și implementează interfața java.io.DataInput.
 
Constructor:

    public DataInputStream(InputStream in) - creează un flux de date de intrare, care citește date din fluxul de intrare in, primit ca argument. 

Metode:
Aceasta clasă conține toate metodele clasei java.io.InputStream, la care se adaugă următoarele metode specifice, prin care se implementează interfața java.io.DataInput

    public final void readFully(byte[] b) throws IOException - citește din fluxul de intrare un număr de octeți egal cu lungimea tabloului b, primit ca argument, și îi pune în acest tablou. Dacă în fluxul de intrare nu sunt înca suficienți octeți, dar nu s-a atins sfârșitul de fișier, procesul este pus în așteptare până apar noi octeți. Dacă se întâlnește sfârșitul de fișier (EOF - End of File), se generează o EOFException; 
    public final void readFully(byte[] b, int off, int len) throws IOException - acționează similar cu metoda precedentă, dar se citesc len octeți, care sunt depuși în tabloul b, începand de la poziția off; 
    public final void skipBytes(int n) throws IOException - sare peste n octeți din fluxul de intrare; întoarce numărul de octeți săriți efectiv (este posibil să nu reușească să sară n octeti, de exemplu dacă a întalnit sfârșitul fluxului); 
    public final boolean readBoolean() throws IOException - citește un octet din fluxul de intrare și îl convertește în valoare booleană; 
    public final byte readByte() throws IOException - citește din fluxul de intrare un singur octet, pe care îl tratează ca un număr întreg cu semn în intervalul [-128, 127]; se consideră că a fost scris cu writeByte(byte v)
    public final int readUnsignedByte() throws IOException - citește din fluxul de intrare un singur octet, pe care îl tratează ca număr întreg fără semn în intervalul [0, 255] și îl întoarce sub formă de int
    public final short readShort() throws IOException - citește doi octeți din fluxul de intrare și îi interpretează ca un număr de tip short, scris anterior cu writeShort(short v); 
    public final int readUnsignedShort() throws IOException - citește din fluxul de intrare doi octeți, pe care îi interpretează ca număr întreg fără semn și-l întoarce sub formă de int
    public final char readChar() throws IOException - citește din fluxul de intrare un char (doi octeți, format Unicode); 
    public final int readInt() throws IOException - citește patru octeți si îi interpretează ca un număr de tip int scris cu writeInt(int v)
    public final long readLong() throws IOException - citeste opt octeți si îi interpretează ca un număr de tip long, scris cu writeLong(long v)
    public final float readFloat() throws IOException - citește patru octeți si îi interpretează ca un număr de tip float, scris cu writeFloat(float v)
    public final double readDouble() throws IOException - citește opt octeți si îi interpretează ca un număr de tip double, scris cu writeDouble(double v)
    public final String readUTF() throws IOException - citește un șir de caractere în format UTF (care a fost scris cu writeUTF(String str)); 

Exemplu
În fișierul FisierDate.java se dă un exemplu de aplicație, în care se creează un fișier de date și se scriu date în acest fișier folosind un DataOutputStream legat la un FileOutpusStream. După ce au fost scrise datele, se închide fișierul pentru scriere și se redeschide pentru citire, după care se citesc datele în aceeași ordine în care au fost scrise. Datele scrise în fișier și cele citite sunt afișate pe ecran pe perechi, pentru comparație.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați