CATEGORII DOCUMENTE |
Bibliotecile de clase de intrare/iesire si utilitare
Prezentarea pachetului java.io
Pachetul Java pentru operatii de intrare/iesire - java.io - este folosit pentru implementarea fluxurilor . Despre fluxuri am discutat in capitolul 8 , "Integrarea tuturor elementelor : fire de executie , exceptii si altele "; reveniti la acest capitol daca veti avea nelamuriri cu privire la exemplele sau informatiile care vor fi prezentate . In continuare , vom discuta despre clasele si metodele pentru manipularea fluxurilor .
Fluxurile sunt folosite pentru transferul unor date dintr-un punct A intr-o aplicatie Java sau dintr-o aplicatie Java intr-un punct B . In acceptiunea cea mai simpla , transmiterea datelor se face sub forma unui flux de octeti , fara informatii de formatare sau de identificare.
Aplicatia este cea care are sarcina de a reformata si de a interpreta fluxul de octeti , pentru a-l putea intelege .
In mod clasic , datele de pe ecran erau stocate in fisiere , pe hard-disc . Mutarea lor consta in deschiderea unui fisier , copierea datelor in memorie , copierea zonelor respective de memorie si mutarea acestora intr-o alta zona de pe disc , sub un alt nume de fisier . Toate etapele acestui proces erau controlate de sistem .
Acest scenariu este astazi complet depasit . Datele pot fi generate de utilizatorii unei retele locale si incarcate intr-un sistem distribuit . Ele pot fi preluate din orice colt al lumii , prin intermediul retelei Internet . Pot fi incarcate de pe hard-disc , de pe banda sau de pe CD-ROM . Sursa de date poate rula pe orice sistem de operare , ceea ce inseamna ca datele pot fi stocate intr-un format necunoscut sistemului de operare pe care se executa aplicatia Java . Ca urmare, Java trebuie sa interpreteze date in formate diferite , provenind de la surse diferite . Aceasta necesita flexibilitate , care sa permita manevrarea datelor fara schimbarea codului la fiecare modificare a originii fluxului . Clasele si metodele din pachetul java.io va ajuta sa rezolvati aceasta problema .
Va amintiti ca ideea de la care a pornit proiectarea limbajului Java a fost crearea unui limbaj de programare independent de platforma . Acest concept include transferul si interpretarea . Clasele si metodele din pachetul java.io permit o mai mare flexibilitate in operatiile de transmitere si receptionare a datelor .
Java furnizeaza modalitati de control al fluxurilor de intrare , cum ar fi metodele mark( ) si reset( ) (despre care am discutat in cap.8 ) . Insa nu toate operatiile Java de intrare/iesire permit folosirea acestor doua metode .
In sectiunile urmatoare , vom discuta despre diferite modalitati de transferare a datelor in Java . Alegeti-o pe cea care corespunde cel mai bine cerintelor dumneavoastra , deoarece fiecare are avantaje si dezavantaje .
Fluxurile de intrare sunt fluxuri de date provenite de la o sursa si incarcate in Java.Originea datelor nu are nici o importanta ; tot ceea ce conteaza este daca datele sunt disponibile pentru a fi transmise aplicatiei Java Toate clasele pentru fluxuri de intrare lanseaza exceptia IOException ( vezi sectiunea " Exceptii " din cap.8 ) .
Toate clasele pentru fluxuri de intrare se bazeaza pe clasa abstracta InputStream . In sectiunea urmatoare , vom discuta despre metodele asociate acestei clase .
InputStream este clasa abstracta care contine toate tipurile posibile de intrari in Java . Subclasele sale folosesc o parte sau chiar toate metodele clasei . Metodele au fost prezentate in sectiunea " Fluxuri de intrare " din cap.8 , dar este bine sa le reamintim .
read ( )
Toate subclasele clasei InputStream pot citi date dintr-un flux de intrare . Operatiile de citire se bazeaza pe blocare , proces care permite unei aplicatii Java sa astepte atunci cand fluxul de intrare nu este continuu .
skip ( )
Metoda skip ( ) este folosita in Java pentru a sari peste un anumit numar de octeti din fluxul de intrare . Aceasta metoda este disponibila pentru toate subclasele clasei InputStream .
close ( )
Metoda close ( ) inchide un flux de intrare care nu mai este folosit . Fisierele sunt inchise automat de sistemul de colectare a gunoiului . Totusi , daca fisierul urmeaza sa fie deschis din nou , trebuie sa inchideti manual fluxul de intrare , deoarece nu stiti cand va interveni sistemul de colectare a gunoiului , iar Java nu va deschide un fisier care este deja deschis .
available ( )
Metoda available ( ) este folosita pentru a verifica daca datele sunt pregatite pentru a fi transmise . Nu uitati ca programul se blocheaza daca se lanseaza o instructiune read , fara ca datele sa fie pregatite .In cazul in care instructiunea read apare intr-un fir de executie separat , blocarea nu are nici o importanta , iar metoda available ( ) nu mai este necesara . Totusi , asigurati-va ca acest lucru este posibil in aplicatia dumneavoastra . Folosirea unor fire de executie separate este contraindicata in cazul in care intreaga aplicatie se bazeaza pe datele care urmeaza sa fie transmise . Metoda available ( ) nu este disponibila pentru toate subclasele clasei InputStream .
mark ( ) , markSupported ( ) , si reset ( )
Metoda mark ( ) este folosita pentru a marca un punct in fluxul de intrare , la care programul se poate intoarce ulterior . Metoda markSupported ( ) verifica daca tipul fluxului de intrare respectiv permite folosirea metodei mark ( ) . Metoda reset ( ) determina revenirea la punctul marcat cu ajutorul metodei mark ( ) . Aceste metode nu sunt disponibile pentru toate subclasele clasei InputStream .
Alte detalii referitoare la clasa InputStream si la subclasele acesteia
Subclasele FilterInputStream sunt ByteArrayInputStream , DataInputStream , Filter-InputStream , PipedInputStream , SequenceInputStream si StringBufferInputStream . Fiecare dintre acestea este prezentata detaliat in sectiunile urmatoare .
Clasa FilterInputStream
Clasa FilterInputStream are patru subclase : BufferedInputStream , DataInputStream , LineNumberInputStream si PushbackInputStream . Fiecare dintre acestea conlucreza intr-un mod specific cu clasa FilterInputStream , pentru a-i asigura controlul transferului de date de la un fisier catre clasa respectiva . Clasa FilterInput Stream nu poate actiona de una singura.
Se poate spune ca FilterInputStream este o clasa care furnizeaza structura unui canal pentru transferul datelor , in timp ce subclasele acesteia impart datele citite in fragmente utilizabile . Imaginati-va clasa FilterInputStream ca pe un malaxor care produce aluatul , in timp ce subclasele acesteia transforma aluatul in spaghete , macaroane sau taitei .Datele sunt aluatul neprelucrat . Forma in care se face prelucrarea lui , adica subclasa , poate fi schimbata in timpul procesului , fara a opri masina ; datele continua sa curga.
Subclasele clasei FilterInputStream sunt folosite din plin in scrierea programelor Java .Sectiunile care urmeaza le prezinta pe fiecare in parte . (Cititi documentatia on-line pentru informatii complete privind posibilitatile oferite de fiecare clasa . )
Clasa BufferedInputStream
BufferedInputStream este o subclasa a clasei FilterInputStream si implementeaza toate metodele acesteia .
Observatie:BufferedInputStream este singura clasa in care metodele mark( ) si reset( ) functioneaza
corect .
Un alt avantaj al folosirii clasei BufferedInputStream este faptul ca aceasta creeaza un buffer (zona tampon) de citire , care este o matrice de octeti . Acest buffer contribuie la cursivitatea fluxului de date , astfel incat citirea sa fie continua , fara pauze in care se asteapta ca datele sa ajunga in fluxul de intrare . Dimensiunea zonei tampon (buffer) si cantitatea de date citite pot fi controlate cu ajutorul metodelor din clasa BufferedInputStream . Listingul 12.1 prezinta un exemplu de folosire a claselor BufferedInputSream si BufferedOutputStream .
Listingul 12.1 . Exemplu de folosire a claselor BufferedInputStream si Buffered OutputStream .
/* Observatii :
Aceasta clasa implementeaza fluxuri de intrare / iesire pentru fisiere cu stocarea temporara intr-o zona tampon (buffer) prin extinderea clasei BufferedInputStream . Aceasta nu este o implementare completa a clasei FileInputStream (nu sunt toti constructorii si nici metoda getFd ( ) ) .
Principalul exemplu copiaza primii 128 de octeti din fisierul unu in fisierul doi , apoi readuce fisierul unu la inceput si copiaza tot fisierul unu in fisierul doi . Programul nu are un scop practic , dar ilustreaza modul de creare a unei clase BufferedFileInput Stream care implementeaza metodele mark si reset , pe care clasa FileInputStream nu le accepta .
Sintaxa :
MyMain <fisier sursa > <fisier destinatie > */
import java.io.* ;
public class MyMain
// inchide fisierul sursa
bfis.close ( ) ;
// inchide fisierul destinatie
bfos.close ( ) ;
}
// intercepteaza exceptia aparuta in cazul cand fisierul nu poate fi gasit ( nu face // nimic )
catch ( FileNotFoundException e )
// intercepteaza erorile de intrare/iesire ( nu face nimic )
catch ( IOException e )
}
}
// declara o noua clasa care extinde fluxul de intrare cu stocare in buffer
class BufferedFileInputStream extends BufferedInputStream
}
// declara o noua clasa care extinde fluxul de iesire cu stocare in buffer
class BufferedFileOutputStream extends BufferedOutputStream
}
Clasa DataInputStream
DataInputStream este o subclasa a clasei FilterInputStream. Aceasta implementeaza interfata DataInput. Citind lista metodelor din clasa DataInputStream , principalele utilizari ale clasei devin evidente ( retineti faptul ca aceleasi metode sunt folosite si de clasa RandomAccessFile ) :
readBoolean
readByte
readChar
readDouble
readFloat
readInt
readLine
readLong
readShort
readUTF
readUnsignedByte
readUnsignedShort
Aceste metode sunt folosite pentru citirea tipurilor de date primitive. Va amintiti probabil ca am discutat despre tipurile de date primitive in capitolul 6, ,, Elementele de baza ale limbajului Java " . Clasa DataInputStream interpreteaza tipurile de date primitive de pe diferite platforme si le face accesibile programelor Java .
Clasa LineNumberInputStream
LineNumberInputStream este o subclasa a clasei FilterInputStream . Ea memoreaza numerele liniilor, pentru marcarea si reinitializarea fluxurilor de intrare . De asemenea clasa LineNumberInputStream poate fi folosita pentru imbricarea operatiilor de tratare a fluxurilor de intrare , astfel incit citirea fluxului in diverse scopuri si inregistrarea numerelor de linii sa aiba loc simultan .
Clasa PushbackInputStream
PushbackInputStream este o subclasa a clasei FilterInputStream . Ea creeaza un buffer de intrare de un singur octet , care permite fluxului de intrare sa retraga octetul care a fost citit . In acest fel , un octet poate fi testat inainte de prelucrare . Listingul 12.2 prezinta un exemplu de folosire a clasei PushbackInputStream .
/* Observatii :
Aceasta clasa implementeaza un program de cautare a cuvintelor . Un cuvant este definit ca un sir de caractere Cuvintele se deosebesc de subsirurile de caractere prin faptul ca sunt urmate de un spatiu . Algoritmul determina parcurgerea fluxului de intrare . Daca gaseste cuvantul cautat , programul returneaza in fluxul de intrare spatiul care delimiteaza cuvantul , astfel incat acesta sa poata fi prelucrat , eventual , de un alt algoritm .
Exemplul principal accepta ca argumente in linia de comanda sirul de caractere cautat si numele fisierului in care se face cautarea . Programul afiseaza textul " Cuvantul a fost gasit " daca gaseste sirul de caractere cautat si textul " Cuvantul nu a fost gasit " in caz contrar .
Sintaxa :
MyMain < Sir de cartactere cautat > < fisier de cautat >
*/
imort java.io.* ;
public class MyMain
// trateaza exceptia aparuta daca fisierul nu a fost gasit
catch ( FileNotFoundException e )
}
}
// declara clasa FindWord
class FindWord
// declara metoda pentru gasirea unui cuvant in fluxul de intrare
public boolean find ( String word )
// compara caracterele din fluxul de intrare cu cuvantul cautat
if (( char ) buf [0] != sbWord.charAt (i) )
// trateaza exceptiile de intrare/iesire
catch (IOException e)
}
// daca s-a ajuns in acest punct , inseamna ca a fost gasit cuvantul ; trebuie
// reintrodus spatiul in flux
try
// trateaza exceptiile IO
catch ( IOException e )
// returneaza valoarea true deoarece a fost gasit cuvantul
return (true) ;
}
// returneaza valoarea false , deoarece nu a fost gasit cuvantul
return (false) ;
}
}
Clasa ByteArrayInputStream
ByteArrayInputStream extinde clasa Input Stream . Ea este folosita pentru crearea unui flux de intrare intr-o zona tampon (buffer) .Accesul la fluxul de intrare este permis in limita numarului de octeti stabilit de programator . Transferul datelor catre fluxul de intrare este controlat de trei variabile:
. buf - zona tampon in care sunt stocate datele
. Count - numarul de octeti care vor fi folositi de buffer
. Pos - pozitia curenta in buffer
Clasa ByteArrayInputStream permite folosirea metodei reset ( ) , care reia fluxul de intrare de la inceput . Clasa nu contine o metoda mark ( ) care sa marcheze un anumit punct in fluxul de intrare .
Clasa FileInputStream
FileInputStream extinde clasa InputStream .Ea permite programelor Java sa citeasca fisiere . Este vorba despre fisierele secventiale , nu despre tabele hash sau fisiere indexate . Fisierul respectiv trebuie sa fie accesibil pentru programul Java .
Nu uitati sa inchideti explicit fisierul utilizat ca flux de intrare , daca urmeaza sa-l mai folositi si dupa ce urmeaza sa ajungeti la sfirsitul lui . Pentru clasa FileInputStream , nu sunt disponibile metodele mark ( ) si reset ( ) . Singura posibilitate de a reveni la un punct anterior este sa sariti la acesta si sa incepeti sa cititi pentru a gasi datele cautate . Nu exista nici o modalitate de a obtine pozitia exacta in fisier .
Reveniti la sectiunea "Fluxuri de intrare" din capitolul 8 , pentru a vedea un exemplu de folosire a clasei FileInputStream .
Clasa SequenceInputStream
Clasa SequenceInputStream permite citirea secventiala a mai multor fisiere si transformarea acestora intr-un singur flux de intrare . Primul fisier este citit pana la sfarsit , apoi este citit urmatorul fisier si asa mai departe . La iesire , se obtine o matrice de octeti . Singurele metode disponibile pentru aceasta clasa sunt read ( ) si close ( ) .
Puteti folosi clasa SequenceInputStream pentru receptionarea mai multor intrari , crearea unui singur flux de intrare si transmiterea acestuia unei clase care contine mai multe metode de manipulare a datelor .
ClasaStringBufferInputStream Clasa StringBufferInputStream este folosita pentru crearea unui flux de intrare intr-o zona tampon(buffer) . Fluxul de intrare este o matrice de siruri de caractere . Transferul datelor catre fluxul de intrare este controlat de trei variabile :
. buf - zona tampon in care sunt stocate datele
. Count - numarul de octeti care vor fi folositi de buffer
. Pos - pozitia curenta in buffer
Clasa StringBufferInputStream este asemanatoare cu clasa ByteArrayInputStream ; singura diferenta este faptul ca ByteArrayInputStream citeste fluxul ca o matrice de octeti , in timp ce StringBufferInputStream creeaza fluxul de intrare ca o matrice de siruri de caractere . Clasa StringBufferInputStream permite folosirea metodei reset ( ) , care reia fluxul de intrare de la inceput . Nu exista o metoda mark ( ) care sa poata fi folosita pentru marcarea unui anumit punct in fluxul de intrare .
Fluxurile de iesire Java
Ca si in cazul fluxurilor de intrare , puteti reveni la capitolul 8 , care cuprinde o prezentare detaliata a fluxurilor de iesire . Aici, vom face doar o scurta trecere in revista a acestora . Vom discuta despre pachetul java.io si despre clasele sale pentru fluxuri de iesire .
Fluxurile de iesire sunt fluxuri de date generate de o aplicatie sau de o miniaplicatie Java pentru a fi folosite in alta parte . Exista mai multe modalitati de formatare a datelor de iesire : redirectarea , stocarea intr-o zona tampon (buffer) , afisarea pe ecran , stocarea intr-o matrice de octeti sau trimiterea catre un fisier . Clasele pentru fluxuri de iesire realizeaza operatiile de iesire .
Toate clasele pentru fluxuri de iesire se bazeaza pe clasa abstracta OutputStream . In sectiunea urmatoare , vom discuta despre metodele asociate acestei clase .
Clasa OutputStream
OutputStream este clasa abstracta care contine toate tipurile posibile de iesiri din Java. Subclasele sale sunt BufferedOutputStream , FileOutputStream , FilterOutputStream , PipedOutputStream si PrintStream .
Subclasele clasei OutputStream folosesc o parte sau chiar toate metodele acesteia , metode care au fost discutate in capitolul 8 , dar este bine sa le reacapitulam pe scurt .
write ( )
Metoda write ( ) este folosita pentru scrierea datelor intr-un flux de iesire . Rezultatele sunt diferite , in functie de clasa . Toate metodele write ( ) se aseamana prin faptul ca folosesc blocarea , ceea ce inseamna ca asteapta ca dispozitivul receptor sa fie pregatit . De asemenea , toate metodele write ( ) lanseaza exceptia IOException .
A se vedea sectiunea ,,Fluxuri de iesire" din capitolul 8 , pentru un exemplu de folosire a metodei write ( ) .
flush ( )
Metoda flush ( ) este folosita pentru a forta scrierea datelor stocate in zona tampon la dispozitivul de iesire . Aceasta este singura modalitate de a iesi dintr-un blocaj si poate reprezenta unica solutie de scriere a datelor , atunci cand dispozitivul receptor solicita acest lucru
close ( )
Metoda close ( ) inchide un flux de iesire . Ea este similara cu metoda close ( ) folosita pentru fluxurile de intrare . Sistemul automat de colectare a gunoiului inchide oricum toate fluxurile de iesire la terminarea aplicatiei sau miniaplicatiei , dar este bine sa va asigurati ca ati inchis explicit fluxul de iesire , pentru cazul in care aplicatia nu poate astepta ca aceasta operatie sa fie efectuata de sistem .
Clasa FilterOutputStream
Clasa FilterOutputStream are trei subclase : BufferedOutputStream , DataOutputStream si PrintStream . Fiecare dintre acestea conlucreaza intr-un mod specific cu clasa FilterOutputStream , pentru a-i asigura controlul transferului de date catre un fisier . Clasa FilterOutputStream nu poate actiona de una singura . ( Aceasta clasa este echivalenta cu clasa FilterInputStream . )
Fiecare subclasa este prezentata detaliat in sectiunile urmatoare . ( Ctiti documentatia on-line pentru informatii complete privind posibilitatile oferite de fiecare clasa . )
Clasa BufferedOutputStream
Clasa BufferedOutputStream implementeaza toate metodele superclaseiOutputStream. Ea foloseste metoda flush( ) si poate crea un flux de iesire imbricat , pentru a permite golirea fortata a altor fluxuri de iesire Un alt avantaj al folosirii clasei BufferedOutputStream este faptul ca aceasta creaza un buffer de scriere , sub forma unor matrice de octeti . Acest buffer contribuie la cursivitatea fluxului de date , astfel incat scrierea sa fie continua , fara pauze in care se asteapta ca datele sa ajunga in fluxul de iesire . Dimensiunea zonei tampon (buffer) si cantitatea de date scrise pot fi controlate cu ajutorul metodelor din clasa BufferedOutputStream .
Clasa DataOutputStream
Clasa DataOutputStream implementeaza interfata DataOutput . Ea reprezinta inversa clasei DataInputStream si este folosita pentru scrierea tipurilor de date primitive . Iata o lista a metodelor asociate acestei clase :
writeBoolean
writeByte
writeChar
writeDouble
writeFloat
writeInt
writeLine
writeLong
writeShort
writeUTF
writeUnsignedByte
writeUnsignedShort
Clasa DataOutputStream este folosita impreuna cu clasa BufferedInputStream , pentru scrierea si citirea tipurilor de date primitive intre platforme diferite .
Clasa PrintStream
Clasa PrintStream este folosita pentru afisarea datelor formatate pe ecranul utilizatorului . Clasa PrintStream este utilizata de fapt pentru scriere de catre metode ca :
Sysrem.out.print( )
System.out.println( )
PrintStream permite executarea unei operatii de golire automata a fluxului de iesire . Clasa contine doi constructori :
PrintStream ( OutputStream ) - creeaza un nou obiect PrintStream
PrintStream ( OutputStream , boolean ) - creeaza un nou obiect PrintStream cu golire
automata
Clasa PrintStream formateaza tipuri de date primitive si le afiseaza pe ecran . Iata care sunt metodele folosite de aceasta clasa :
print ( Object )
print ( String )
print ( char [ ] )
print ( char )
print ( int )
print ( long )
print (float )
print ( double )
print ( boolean )
println ( )
println (Object )
println ( String )
println ( char [ ] )
println ( char )
println ( int )
println (long )
println ( float )
println ( double )
println ( boolean )
Exemplu de folosire a clasei PrintStream
/* Observatii :
Aceasta clasa implementeaza o clasa generica de scriere care poate scrie un tip de obiect intr-un fisier . Constructorul este folosit pentru deschiderea fisierului . Fluxul de iesire rezultat este folosit drept consrtuctor al clasei PrintStream . Clasa PrintStream poate scrie orice fel de obiecte . In mod implicit , clasa PrintStream foloseste metodele " toString " pentru a converti obiectele in siruri de caractere .
Este creata o clasa oarecare , numita PhoneInfo , doar pentru a demonstra posibilitatea clasei PrintStream de scriere a oricarui tip de obiecte .
Exemplul principal completeaza o matrice PhoneInfo , apoi foloseste clasa WriteObjToFile pentru a scrie informatiile in fisier . Numele fisierului in care se scrie este specificat in linia de comanda .
Sintaxa :
MyMain <fisier destinatie > */
import java.io.* ;
public class MyMain ;
try
}
// intercepteaza exceptiile IO
carch ( IOException e )
}
}
// declara clasa PhoneInfo
class PhoneInfo
// declara metoda toString ( ) pentru returnarea unei reprezentari sub forma unui sir de
// caractere a instantei
public String toString ( )
}
// declara clasa WriteObjToFile
class WriteObjToFile
// trateaza eroarea aparuta in cazul negasirii fisierului
catch ( FileNotFoundException e)
}
// declara metoda pentru scrierea unui obiect arbitrar
public void write ( Object o )
}
Clasa ByteArrayOutputStream
ByteArrayOutputStream , perechea clasei ByteArrayInputStream , este folosita pentru crearea unui flux de iesire dintr -o zona tampon ( buffer ) - adica transfera iesirile Java intr-un buffer . Dimensiunile zonei tampon variaza in functie de necesitati .
Transferul datelor catre fluxul de iesire este controlat de doua variabile :
buf - zona tampon in care sunt stocste datele
Count - numarul de octeti din buffer
Clasa ByteArrayOutputStream permite folosirea metodei reset ( ) , care reinitializeaza bufferul
fluxului de iesire , astfel incat spatiul de memorie ocupat de acesta sa nu fie eliberat si sa poata fi refolosit . Clasa nu contine o metoda mark ( ) pentru marcarea unui anumit punct un fluxul de
iesire .
Clasa FileOutputStream
Clasa FileOutputStream , perechea clasei FileInputStream , permite programelor Java sa scrie in fisiere . Fisierul si directorul in care se scrie trebuie sa fie accesibile programului Java ,ceea ce constituie un aspect legat de securitate .
ATENTIE : Nu uitati sa inchideti explicit fisierul folosit ca flux de iesire , daca urmeaza sa-l mai folositi dupa ce ajungeti la sfarsitul lui . In caz contrar , fisierul nu va include un marcaj de sfarsit si veti obtine erori .
Iata care sunt metodele disponibile in clasa FileOutputStream :
close ( ) - inchide fluxul de iesire
finalize ( ) - inchide fluxul de iesire in timpul operatiei de colectare a gunoiului
getFD ( ) - returneaza descriptorul de fisier asociat acestui flux
write ( int ) - scrie un octet de date
write ( byte [ ] ) - scrie o matrice de octeti
write ( byte [ ] , int , int ) - scrie o submatrice de octeti
Clasa PipedOutputStream
Clasa PipedOutputStream permite transferul datelor intre doua fire de executie conectate cu ajutorul clasei PipedInputStream . Deoarece clasa PipedOutputStream este conectata cu clasa PipedInputStream , ele trebuie sa lucreze impreuna .
Iata care sunt metodele asociate acestor clase :
close ( ) - inchide fluxul de iesire
connect ( PipedInputStream ) - conecteaza fluxul de iesire curent la un receptor
write ( int ) - scrie un octet de date
write ( byte [ ] , int , int ) - scrie o submatrice de octeti
Alte clase de intrare/iesire
Pachetul java.io contine inca doua clase pentru lucrul cu fisiere : File si RandomAccessFile .
Clasa File
Clasa File este folosita pentru reprezentarea unui nume de fisier pe un sistem gazda . Clasa nu poate sa citeasca un fisier sau sa scrie in fisier , dar poate obtine unele informatii despre acesta ,cum ar fi numele , calea de acces si altele . Ea furnizeaza o modalitate abstracta de folosire a unui fisier specific platformei .
Clasa RandomAccessFile
Clasa RandomAccessFile implementeaza interfetele DataInput si DataOutput . Ea combina diverse metode de acces la fisiere , atatpentru citire cat si pentru scriere , in limitele de securitate impuse de Java . Clasa contine numeroase metode pentru scierea si citirea tipurilor de date primitive , pentru inchiderea si localizarea unui fisier . De asemenea , RandomAccessFile permite folosirea metodei skip ( ) .
Pachetul java.util
Pachetul java.util este un fel de trusa de instrumente pentru tot felul de utilitare . El contine urmatoarele clase :
BitSet
Date
Dictionary
Hashtable
Observable
Properties
Random
Stack
StringTokenizer
Vector
Dupa cum vedeti , pachetul contine o diversitate de clase . Pentru mai multe detalii despre metodele asociate , puteti apela la documentatia on-line .
Clasa BitSet
Clasa BitSet creeaza un set de biti de dimensiune variabila .Ea contine metode pentru manipularea acestor biti . Listingul 12.4 prezinta un exemplu de folosire a clasei BitSet .
/* Observati :
Aceasta clasa genereaza si verifica paritatea a 7 biti
*/
import java.util.*;
public class MyMain
}
class Parity
}
}
public void genParity ( )
}
if ( ( cnt % 2 ) = = 0 ) // testeaza daca numarul obtinut este par sau impar
b.clear( 7 ) ; // daca par , sterge bitul de paritate
else
b.set( 7 ) ; // impar , pune pe 1 bitul de paritate
}
public boolean chkParity ( )
}
}
if ( b.get( 7 ) ) // obtine bitul de paritate
parityBit = 1 ; // pune pe 1 bitul de paritate
else
parityBit = 0 ; // pune pe 0 bitul de paritate
if ( ( ( cnt % 2 ) ^ parityBit ) = = 0 ) // verifica daca bitul de paritate este stabilit corect
return ( true ) ; // nu a fost detectata eroare de paritate
return ( false ) ; // a fost detectata o eroare de paritate
}
}
Clasa Date
Clasa Date furnizeaza metode pentru examinarea si manipularea datei calendaristice . In Java , timpul este masurat in milisecunde , incepand de la 1 ianurie 1970 . Java incearca sa manipuleze informatiile de timp furnizate de sistemul cu care interactioneaza . Formatul UTC( Coordinated Universal Time ) reprezinta timpul universal coordonat , care pare a fi standard international .
Observatie : Clasa Date nu functioneaza corespunzator documentatiei pentru interfata Java API . Desi ar trebui sa poata trata orice data incepand din anul 1900 , datele anterioare zilei de 1 ianuarie 1970 nu sunt ,in general , utilizabile .
Tabelul 12.1 Metodele disponibile in clasa Date
Metoda Scop
UTC( int,int,int,int,int ) Calculeaza o valoare UTC din YMDHMS ( an
luna , zi , ora , minut , secunda )
after( Date ) Verifica daca data curenta este ulterioara datei
specificate
before( Date ) Verifica daca data curenta este anterioara datei
specificate
equals( Object ) Compara obiectul curent cu cel specificat
getDate( ) Returneaza ziua din luna
getDay( ) Returneaza ziua din saptamana
getHours( ) Returneaza ora
getMinutes( ) Returneaza minutul
getMonth( ) Returneaza luna
getSeconds( ) Reurneaza secunda
getTime( ) Reurneaza timpul scurs de la inceputul epocii ,
in milisecunde
getTimezoneOffset( ) Returneaza diferenta de timp , in minute ,
pentru zona curenta , in functie de perioada
getYear( ) Returneaza numarul de ani de la 1900
hashCode( ) Calculeaza un numar folosit pentru stocarea
obiectelor in tabele hash
parse( String ) Primeste ca parametru un sir de caractere care
reprezinta timpul si returneaza o valoare temporala
setDate( int ) Stabileste data
setHours( int ) Stabileste ora
setMinutes( int ) Stabileste minutul
setMonth( int ) Stabileste luna
setSeconds( int ) Stabileste secunda
setTime( long ) Stabileste ora curenta
setYear( int ) Stabileste anuk
toGMTSString( ) Converteste data intr-un obiect de tip String ,
folosind conventiile Internet GMT
toLocaleString( ) Converteste data intr-un obiect de tip String ,
folosind conventiile locale
toString( ) Converteste data intr-un obiect de tip String ,
folosind conventiile UNIX
Este important de retinut ca lunile incep cu 0 ,care este ianuarie , si se termina cu 11 , care este decembrie . La fel , zilele saptamanii incep cu 0 , care este duminica , si se termina cu 6 , care este sambata . Datele lunii sunt numerotate normal .
Observatie : Datele care nu se inscriu in domeniul de parametri sunt interpretate prin iteratii consecutive . De exemplu , data de 32 ianuarie este recunoscuta ca fiind 1 februarie .
Exemplu de folosire a clasei Date :
/* Observatii :
Utilitarele pentru date calendaristice din pachetul java.util nu pot folosi date anterioare anului 1970 , chiar daca in documentatie limita inferioara este anul 1900 .Utilizare : data este specificata ca prim argument din linia de comanda :
MyMain " 18 Apr 1972 "
*/
import java.util.* ;
public class MyMain
}
class BDay
c = new Date( " 19 Feb " + year ) ; // la fel pentru Varsator
if ( d.before( c ) )
c = new Date( " 21 Mar ' + year ) ; // la fel pentru Pesti
if ( d.before( c ) )
c = new Date( " 20 Apr " + year ) ; // la fel pentru Berbec
if ( d.before( c ) )
c = new Date( " 21 May " + year ) ; // la fel pentru Taur
if ( d.before( c ) )
c = new Date( " 21 Jun " + year ) ; // la fel pentru Gemeni
if ( d.before( c ) )
c = new Date( " 23 Jul " + year ) ; // la fel pentru Rac
if ( d.before( c ) )
c = new Date( " 23 Aug " + year ) ; // la fel pentru Leu
if ( d.before( c ) )
c = new Date( " 23 Sep " + year ) ; // la fel pentru Fecioara
if ( d.before( c ) )
c = new Date( " 23 Oct " + year ) ; // la fel pentru Balanta
if ( d.before( c ) )
c = new Date( " 22 Nov " + year ) ; // la fel pentru Sagetator
if ( d.before( c ) )
c = new Date( " 22 Dec " + year ) ; // la fel pentru Scorpion
if ( d.before( c ) )
c = new Date( " 31 Dec " + year ) ; // pentru ultima perioada din Capricorn
if ( d.before( c ) )
}
}
// declara metoda pentru informatiilor despre data nasterii
public void printBDayInfo ( )
}
Clasa Dictionary
Dictionary este o clasa abstracta . Singura ei clasa este Hashtable . Clasa Dictionary este folosita pentru a crea o modalitate de organizare a obiectelor . ( A se vedea sectiunea " Clasa Hashtable " pentru un exemplu de implementare a clasei Dictionary ) .Scopul sau este accesul non-secvential la obiecte ; acestea sunt identificate cu ajutorul unor chei , care permit si accesul la ele .Imaginati-va aceasta clasa ca stocand obiectele intr-o maniera similara unui fisier indexat .
Clasa Hashtable
Hashtable extinde clasa Dictionary si este folosita pentru maparea unr chei la anumite valori .Metodele asociate clasei Hashtable permit plasarea , localizarea si regasirea obiectelor folosite drept shei . Clasa Hashtable este extinsa de clasa Properties .
Clasa Properties
Properties este o clasa care incarca un flux de intrare intr-un tabel hash . Datele pot fi salvate si citite din tabelul hash .
Clasa Random
Clasa Random contine metode pentru crearea unor numere pseudo-aleatoare . Acestea pot fi de tip Gaussian , Double , Float , Int sau Long . Numarul initial pate fi modificat cu ajutorul metodei corespunzatoare .
Clasa Vector
Vector este clasa parinte a clasei Stack . Este o clasa abstracta , folosita pentru implementarea unei matrice de obiecte , a carei dimensiune poate creste .
Clasa Stack
Clasa Stack extinde clasa Vector si creeaza o stiva de obiecte de tip LIFO .
Exemplu de folosire a clasei Stack :
/* Observatii :
Java si Java NT nu accepta "-" ca argument in linia de comanda . Utilizatorul trebuie sa specifice "- - " pentru ca programul sa vada "-" . Acest program functioneaza prinspecificarea unui sir de caractere RPN in linia de comanda .
*/
import java.util.* ;
public class MyMain
}
class RPNCalculator
catch( java.lang.NumberFormatException e ) // sirul de caractere nu este un
// numar , trebuie sa fie un operator
num[j] = ( ( Integer ) s.pop( ) ) . intValue( ) ; // extrage operanzii din stiva
}
switch ( operator.charValue( ) ) // instructiune switch bazata pe operator
}
}
System.out.println( ( Integer ) s.pop( ) ) . intValue( ) ) ; // valoarea ramasa in stiva
// constituie raspunsul si este afisata pe ecran
}
}
Clasa StringTokenizer
Clasa StringTokenizer furnizeaza metode pentru convertirea unui flux de intrare intr-un set de atomi . Aceste metode precizeaza caracterele care formeaza atomii si caracterele de delimitare a atomilor , specifica daca se face diferenta intre literele mari si literele mici si daca exista caractere numerice care trebuie convertite in numere . De asemenea , aceasta clasa recunoaste conventiile de marcare a comentariilor din C , C++ , si Java (// si /* */ ) . Clasa StringTokenizer specifica toate partile care formeaza un atom , apoi citeste din fluxul de intrare , element cu element , atomul respectiv . Aceasta functiune este utila in multe situatii , de la impartirea unei propozitii simple in cuvinte , pana la prelucrarea unor texte complexe , cum ar fi codul sursa Java ( vezi documentatia on - line ) .
Daca fluxul de date nu este continuu ,clasele pot folosi blocarea , adica pot astepta pana cand datele devin disponibile . Atat clasele de intrare cat si cele de iesire furnizeaza buffere pentru a asigura continuitatea fluxurilor de date . Toate clasele de intrare pot determina saltul peste un numar de octeti din fluxul de intrare ; unele clase marcheaza un punct in fluxul de intrare , pentru reinitializarea acestuia . Exista clase care stocheaza datele primite in matrice de octeti , iar una dintre clasele de intrare stocheaza datele intr-o matrice de siruri de caractere .
Datele citite sau stocate trebuie sa se afle intr-o zona distincta ,accesibila programului Java .O mare parte din schema de securitate a limbajului Java se bazeaza pe separarea datelor Java de datele sistemului . Ca urmare , este contraindicat sa stocati in aceasta zona o copie a fisierului de parole .
Pentru clasele din pachetul java.io originea datelor nu are nici o importanta ; conteaza doar intentia programatorului in legatura cu ele . Clasele de manipulare a datelor permit programelor Java sa fie cu adevarat independente de platforma , chiar si atunci cand manevreaza date .
Pachetul java.io contine clase care adauga noi functionalitati limbajului Java . Exista o clasa pentru manipularea datelor calendaristice ( Date ) , una pentru crearea si manipularea seturilor de biti (BitSet) , clase care creeaza un tabel hash pentru structura unui fisier de obiecte ( Dictionary si Hashtable ) , un generator de numere pseudo-aleatoare ( Random ) , o clasa care creeaza o stiva de obiecte ( Stack ) si alta care transforma un sir de caractere in atomi ( StringTokenizer ) .
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1117
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved