Citirea  fișierelor

Citirea fluxurilor de octeți: clasa FileInputStream

Clasa java.io.FileInputStream permite citirea datelor din fișiere sub forma de fluxuri de octeți. Orice instanță a acestei clase este un flux de intrare, care are ca sursă un fișier. La crearea acestei instanțe se caută și se deschide fișierul indicat ca argument al constructorului. Dacă fișierul nu există, sau nu poate fi deschis pentru citire, se generează o excepție.
 

Constructorii și metodele clasei FileInputStream

Metodele acestei clase permit să se citească din fișierul de intrare octeți sau secvențe de octeți, fără a le da nici o interpretare.

Constructori:
    public FileInputStream(String name) throws FileNotFoundException - se creează un flux de intrare de octeți având ca sursă fișierul name; (name este numele fișierului; dacă acesta nu se află în directorul curent, atunci șirul  name conține și calea);
    public FileInputStream(File file) throws FileNotFoundException - se creează un flux de intrare de octeți având ca sursă fișierul indicat de instanța file a clasei File;
    public FileInputStream(FileDescriptor fdObj) - se creează un nou flux de intrare de octeți, care este conectat la fluxul de intrare  fdObj deja existent.

Metode:
    public int read() throws IOException - citește din fișier un singur octet; dacă octetul nu este înca disponibil în fluxul de intrare, programul intră în așteptare;
    public int read(byte[] b) throws IOException - se citesc din fișier cel mult b.length octeți, care se pun în tabloul b; întoarce numărul de octeți citit efectiv, sau zero dacă s-a intâlnit sfârșitul de fisier fără să se citească nici un octet; dacă în fluxul de intrare nu mai sunt octeți de citit, dar nu s-a întâlnit sfârșitul de fișier, programul intră în așteptare;
    public int read(byte[] b, int off, int len) throws IOException - se citesc din fluxul de intrare cel mult len octeți, care se pun în tabloul b începând de la poziția off (offset); întoarce numărul de octeți citit efectiv; dacă s-a întâlnit sfârșitul de fișier fără să se citească nici un octet,  intoarce -1; dacă nu s-a întâlnit sfârșitul de fișier și nu sunt octeți disponibili pentru citire în fluxul de intrare, programul intră în așteptare;
    public long skip(long n) throws IOException - se sare peste n octeți din fișierul de intrare; se întoarce numărul de octeți săriți efectiv;
    public int available() throws IOException - întoarce numărul de octeți disponibili pentru citire din fluxul de intrare;
    public void close() throws IOException - închide fișierul;
    public final FileDescriptor getFD() throws IOException - întoarce un descriptor al acestui fișier.

NOTA: descriptorii de fișiere sunt obiecte care aparțin clasei java.io.FileDescriptor și pot fi folosiți ca argument al constructorului pentru a crea un nou flux conectat la un fișier deja deschis. Clasa FileDescriptor conține, de asemenea, câmpurile statice in, out și err, care sunt descriptori ai fluxurilor de intrare/ieșire standard. În consecință, dacă se folosește ca argument al constructorului clasei FileInputStream obiectul FileDescriptor.in, se creaza un flux care citește datele de la tastatura.

Exemplu:
În fișierul TestFileInput.java este un exemplu de aplicație, în care se testeaza metodele clasei FileInputStream. În aplicație se deschide fișierul f1, prin care se citesc octeți dintr-un fișier de text, al cărui nume se dă ca parametru în linia de comandă, după care octeții respectivi se afișează. Întrucât se știe că f1 este un fișier de text, octeții sunt afișati convertiți în caractere. Se deschide apoi un al doilea flux, f2, care este echivalent cu f1, deoarece au același descriptor. În consecință, în continuare fluxurile f1 și f2 citesc date din același fișier. În final, se creează un nou flux (cu referința f1), care citește datele de la tastatura, deoarece la creare s-a folosit descriptorul FileDescriptor.in. Acesta este câmpul in din clasa java.io.FileDescriptor și este o referință la fluxul de intrare standard, deci tratează fluxul de la tastatură ca pe un fișier folosit pentru citire.
 

Citirea din fișiere de caractere: Clasa FileReader

Citirea unui fișier de text se poate face nu numai folosind o instanță a clasei FileInputStream, ci și o instanță a clasei FileReader. Deosebirea este că această ultimă clasă creează un flux de caractere, în loc de un flux de octeți. Chiar dacă fișierul nu este codificat în Unicode, ci în alt cod de caractere (de cele mai multe ori ASCII), se face automat conversia în Unicode. Clasa java.io.FileReader este derivată din clasa java.io.InputStreamReader și folosește metodele acesteia.
 
Constructori:
    public FileReader(String fileName) throws FileNotFoundException - deschide ca flux de caractere de intrare fișierul cu numele fileName (eventual acest șir cuprinde și calea);
    public FileReader(File file) - throws FileNotFoundException - deschide ca flux de intrare de caractere fișierul cu calea file;
    public FileReader(FileDescriptor fd) - deschide un nou flux de intrare de caractere și îl conectează la fluxul deja existent, al cărui descriptor este fd.

Metode:
Clasa FileReader nu are metode proprii, dar moștenește următoarele metode ale clasei InputStreamReader:

    public int read() throws IOException - citește din fluxul de intrare un singur caracter și-l întoarce convertit în int;
    public int read(char[] buf, int off, int len) throws IOException - citește din fluxul de intrare cel mult len caractere, pe care le pune în tabloul buf începând de la poziția off (offset);
    public boolean ready() throws IOException - verifică dacă fluxul de intrare este gata pentru citire (dacă conține caractere care pot fi citite);
    public void close() throws IOException - închide fluxul de intrare;
    public String getEncoding() - întoarce numele canonic al codului folosit pentru caractere.

Exemplu:
În fișierul TestFileReader.java este dat un exemplu de aplicație în care se testează metodele clasei FileReader. Fișierul care se citește poate fi același ca și în cazul citirii cu un flux de octeți (din clasa FileInputStream). În această aplicație, citirea fișierului se face de trei ori, folosind diverse metode.



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