Clasele de bază ale ierarhiilor de fluxuri de intrare/ieșire

Clasa Reader

Clasa abstractă java.io.Reader este rădăcina ierarhiei de clase de fluxuri de intrare de caractere.

Metode:

    public int read() throws IOException - citește din fluxul de intrare un singur caracter; întoarce caracterul citit (în domeniul 0 .. 16383) sau -1 dacă s-a ajuns la sfârșit de fișier; metoda produce blocarea procesului în care este invocată, până când apare un caracter în fluxul de intrare;
    public int read(char[] cbuf) throws IOException - citește din flux o secvență de caractere și le depune într-o zonă tampon (buffer) constituită din tabloul de caractere cbuf; întoarce numărul de caractere citite sau -1 dacă s-a atins sfârșitul de fișier; metoda produce blocarea procesului până când apar caractere în fluxul de intrare, sau se ajunge la sfârșit de fișier;
    public abstract int read(char[] cbuf, int off, int len) throws IOException - acționează asemănător cu metoda precedentă, dar depunerea caracterelor citite în zona tampon de destinație se face începând de la poziția off (offset), iar numărul maxim de caractere citite este len;
    public long skip(long n) throws IOException - se sare peste n caractere din fluxul de intrare, care nu vor fi citite; procesul apelant este blocat pană când apare cel puțin un caracter în fluxul de intrare; dacă se întâlnește sfârșitul de fișier, se generează o excepție de intrare/ieșire; întoarce numărul de caractere sărite efectiv;
    public boolean ready() - întoarce true dacă fluxul de intrare este gata pentru a putea fi citit;
    public void mark(int readAheadLimit) throws IOException - marchează poziția curentă în fluxul de intrare, pentru a se putea reveni la ea ulterior; argumentul readAheadLimit indică numărul de caractere care vor putea fi ulterior citite din flux,fără ca acest  marcaj să se piardă; excepția de intrare/ieșire apare dacă fluxul nu suportă marcarea sau dacă se produce altă eroare de intrare/ieșire;
    public boolean markSupported() - indică dacă fluxul suportă marcarea;
    public void reset() throws IOException - dacă fluxul a fost marcat, este readus la poziția corespunzătoare ultimului marcaj; dacă fluxul nu a fost marcat sau nu suportă resetarea, se generează o excepție de intrare/ieșire;
    public abstract void close() throws IOException - închide fluxul; din acest moment, invocarea metodelor read(), ready(), mark() sau reset pentru acest flux va genera o excepție de intrare/ieșire.

Clasa Writer

Clasa abstractă java.io.Writer este rădăcina ierarhiei de clase pentru fluxuri de ieșire de caractere.

Metode:

    public void write(int c) throws IOException - scrie în fluxul de ieșire caracterul c;
    public void write(char[] cbuf) throws IOException - scrie în fluxul de ieșire caracterele conținute în tabloul cbuf;
    public abstract void(char[] cbuf, int off, int len) throws IOException - scrie în fluxul de ieșire len caractere din tabloul cbuf, începând de la poziția off (offset);
    public void write(String str) throws IOException - scrie în flux caracterele existente în șirul str;
    public void write(String str, int off, int len) throws IOException - scrie în flux len caractere din șirul str, începând de la poziția off (offset);
    public abstract void flush() throws IOException - "descarcă" fluxul de ieșire; dacă fluxul a salvat într-o zonă tampon anumite caractere scrise cu metodele write(), aceste caractere sunt scrise efectiv în fluxul de destinație; dacă această destinație este tot un flux, invocă și metoda flush() a acestuia, astfel că se "descarcă" întregul lanț de fluxuri;
    public abstract void close() throws IOException - se închide fluxul de ieșire; invocarea ulterioară a metodelor write() sau flush() pentru acest flux va produce o excepție de intrare/ieșire.

Clasa InputStream

Clasa java.io.InputStream este rădăcina ierarhiei de clase pentru fluxuri de intrare organizate pe octeți.

Metode:

    public int read() throws IOException - citește din fluxul de intrare un singur octet; întoarce octetul citit (in domeniul 0 .. 255) sau -1 dacă s-a ajuns la sfârșit de fișier; metoda produce blocarea procesului în care este invocată, până când apare un octet în fluxul de intrare;
    public int read(byte[] buf) throws IOException - citește din flux o secvență de octeți și îi depune într-o zonă tampon (buffer) constituită din tabloul de octeți buf; întoarce numărul de octeți citiți sau -1 dacă s-a atins sfârșitul de fișier; metoda produce blocarea procesului până când apar octeți în fluxul de intrare, sau se ajunge la sfârșit de fișier;
    public abstract int read(byte[] buf, int off, int len) throws IOException - acționează asemănător cu metoda precedentă, dar depunerea octeților citiți în tabloul de destinație byte[] se face începând de la poziția off (offset), iar numărul maxim de octeți citiți este len;
    public long skip(long n) throws IOException - se sare peste n octeți din fluxul de intrare, care nu vor fi citiți; procesul apelant este blocat până când apare cel puțin un octet în fluxul de intrare; dacă se întâlnește sfârșitul de fișier se generează o eroare de intrare/ieșire; întoarce numărul de octeți săriți efectiv;
    public int available() throws IOException - întoarce numărul de octeți disponibili pentru citire în fluxul de intrare;
    public void mark(int readAheadLimit) throws IOException - marchează poziția curenta în fluxul de intrare, pentru a se putea reveni la ea ulterior; argumentul readAheadLimit indică numărul de octeți care vor putea fi ulterior citiți din flux, fără ca acest  marcaj să se piardă; excepția de intrare/ieșire apare dacă fluxul nu suportă marcarea sau dacă se produce altă eroare de intrare/ieșire;
    public boolean markSupported() - indică dacă fluxul suportă marcarea;
    public void reset() throws IOException - dacă fluxul a fost marcat, este readus la poziția corespunzătoare ultimului marcaj; dacă fluxul nu a fost marcat sau nu suporta resetarea, se generează o excepție de intrare/ieșire;
    public abstract void close() throws IOException - închide fluxul; din acest moment, invocarea metodelor read(), ready(), mark() sau reset() pentru acest flux va genera o excepție de intrare/ieșire.

Clasa OutputStream

Clasa java.io.OutputStream este rădăcina ierarhiei de clase pentru fluxuri de iesire de octeți.

Metode:

    public void write(int c) throws IOException - scrie în fluxul de ieșire ultimul octet al numărului  c;
    public void write(byte[] buf) throws IOException - scrie în fluxul de ieșire octeții conținuti în tabloul buf;
    public abstract void(byte[] buf, int off, int len) throws IOException - scrie în fluxul de ieșire len octeți din tabloul buf, începând de la poziția off (offset);
    public abstract void flush() throws IOException - "descarcă" fluxul de ieșire; dacă fluxul a salvat într-o zonă tampon anumiți octeți scriși cu metodele write(), acești octeți sunt scriși efectiv în fluxul de destinație; dacă această destinație este tot un flux, invocă și metoda flush() a acestuia, astfel că se "descarcă" întregul lanț de fluxuri;
    public abstract void close() throws IOException - se închide fluxul de ieșire; invocarea ulterioară a metodelor write() sau flush() pentru acest flux va produce o excepție de intrare/ieșire.

Considerații privind utilizarea fluxurilor

Se remarcă cu ușurință faptul că metodele claselor Reader și InputStream sunt similare atât ca seigatură (și deci ca mod de invocare), cât și ca funcționalitate. Metodele read(), skip(), mark(), markSupported(), reset() și close() există în ambele clase. Deosebirea este ca în clasa Reader metoda read() citește din fluxul de intrare un caracter, iar în clasa InputStream citește un octet. Metodele read() pentru citirea de secvențe de caractere, respectiv de octeți, se deosebesc numai prin aceea ca în clasa Reader se folosesc ca destinație tablouri de caractere, iar în clasa InputStream se folosesc tablouri de octeți.

Metodele claselor Writer și OutputStream sunt, de asemenea, similare ca signatură și funcționalitate. Metodele write(), flush() și close() există în ambele clase, însă în clasa Writer metoda write() scrie în fluxul de ieșire un caracter, iar în clasa OutputStream scrie un octet. În cazul că în metodele write() se scrie în flux conținutul unui tablou, în clasa Writer acesta este un tablou de caractere, iar in clasa OutputStream este un tablou de octeți.

Remarcăm că ierarhiile de clase Reader și Writer, introduse începând cu JDK 1.1, nu înlocuiesc pe cele anterioare, având ca rădăcini clasele InputStream și OutputStream, ci le completează. Se vor putea deci folosi, după necesități, atât clasele de fluxuri de caractere, cât și cele de fluxuri de octeți.
 

Clasele PrintStream și PrintWriter

Clasele java.io.PrintStream și java.io.PrintWriter se folosesc pentru a transmite către un flux se ieșire date formatate pentru tipărire (afișare). Se știe că forma internă a datelor diferă de forma externă. De exemplu, numerele întregi sunt reprezentate intern sub formă binară, în timp ce pe ecranul calculatorului sau la imprimantă apar sub forma unor șiruri de cifre zecimale, precedate eventual de semn. Metodele claselor PrintStream și PrintWriter fac această conversie din forma internă în cea externă a diferitelor tipuri de date, generând reprezentările datelor respective sub forma de șiruri de octeți (caractere în codul ASCII) sau, respectiv, de caractere Unicode. Aceste clase nu se folosesc în mod independent, ci adaugă altui flux de ieșire (de octeți sau, respectiv, de caractere) capacitatea de formatare a datelor în vederea tipăririi.
 

Clasa PrintStream

Clasa PrintStream conține doua feluri de metode de scriere a datelor: metodele cu numele write() scriu întotdeauna octeți (fără formatare), în timp ce cele cu numele print() sau println() formatează datele, respectând convenția de codificare (pe octeti sau pe caractere) specifică platformei pe care ruleaza aplicația respectivă. Totuși, se recomandă ca pentru a obține fluxuri de caractere să se folosească clasa PrintWriter.
Deosebirea dintre print() și println() este că metodele cu numele println() adaugă, la sfârșitul șirului de octeți generat, un caracter de sfârșit de linie ('\n'). În consecință, dacă se folosește metoda print(), afișarea se face fără a se trece la o linie nouă, în timp ce dacă se folosește metoda println(), după afișare se trece la linie nouă. Dacă fluxul este cu descărcare automată, metoda println() provoacă, de asemenea, descărcarea acestuia (flush).

Constructori:
    public PrintStream(OutputStream out) - creează un nou flux de formatare pentru tipărire, conectat la fluxul de ieșire out; acest flux nu se descarcă automat;
    public PrintStream(OutputStream out, boolean autoFlush) - creeaza un nou flux de formatare a datelor pentru tipărire, conectat la fluxul de ieșire out; al doilea argument indică dacă fluxul se descarcă automat atunci când se întâlneste în flux caracterul '\n' (linie nouă) sau se execută metoda println() sau se tipărește un tablou de octeți.

Metode:
    public void flush() - descarcă fluxul (golește zonele tampon, transmițând conținutul lor la ieșire);
    public void close() - închide fluxul;
    public void write(int b) - scrie în fluxul de ieșire un singur octet (ultimul octet al argumentului);
    public void write(byte[] buf, int off, int len) - se scriu în fluxul de ieșire len octeți din tabloul de octeti buf (buffer), începând de la poziția off (offset);
    public void print(boolean b) - transmite în fluxul de ieșire forma externă a valorii variabilei booleene b, respectiv cuvântul true sau false;
    public void print(char c) - se afișează caracterul c (pe unul sau doi octeți, depinzând de platformă);
    public void print(int i) - se afișează numărul întreg i;
    public void print(long l) - se afișează numărul întreg lung l;
    public void print(float f) - se afișează numărul real în simplă precizie f;
    public void print(double d) - se afișează numărul real în dublă precizie d;
    public void print(char[] s) - se afișează conținutul tabloului de caractere s;
    public void print(String s) - se afișează șirul de caractere s;
    public void print(Object obj) - se afișeaza obiectul obj convertit în șir de caractere prin aplicarea metodei String.valueOf(obj) care, la rândul ei, apeleaza metoda obj.toString() din clasa căreia îi aparține obiectul;
    public void print() - introduce în fluxul de ieșire codul caracterului '\n' (linie nouă);
    public void println(boolean b) - transmit în fluxul de ieșire forma externă a valorii variabilei booleene b, respectiv cuvântul true sau false;
    public void println(char c) - se afișează caracterul c (pe unul sau doi octeți, depinzând de platformă);
    public void println(int i) - se afișează numărul întreg i;
    public void println(long l) - se afișează numărul întreg lung l;
    public void println(float f) - se afișează numărul real în simplă precizie f;
    public void println(double d) - se afișează numărul real în dublă precizie d;
    public void println(char[] s) - se afișează conținutul tabloului de caractere s;
    public void println(String s) - se afișează șirul de caractere s;
    public void println(Object obj) - se afișează obiectul obj convertit în șir de caractere prin aplicarea metodei String.valueOf(obj);

Clasa PrintWriter

Constructori:
    public PrintWriter(Writer out) - creează un nou flux de formatare pentru afișare, fără descărcare automată, conectându-l la fluxul de ieșire pe caractere out;
    public PrintWriter(Writer out, boolean autoFlush) - la fel ca și constructorul precedent, dar al doilea argument specifică dacă are loc descărcarea automată a fluxului;
    public PrintWriter(OutputStream out) - creează un nou flux de formatare pe caractere, fără descărcare automată, conectându-l la fluxul de ieșire pe octeți out; el creează și un OutputStreamWriter intermediar, care face conversia caracterelor pe unul sau doi octeți, dependent de platformă;
    public PrintWriter(OutputStream out, boolean autoFlush) - la fel ca și constructorul precedent, dar al doilea argument indică dacă se face descărcare automată a fluxului.

Metode:
Această clasa implementează aceleași metode ca și clasa PrintStream, cu excepția celor care scriu octeți bruti (write()).



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