plik


ÿþJacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Strumienie, operacje wej[cia-wyj[cia 7.1 Strumienie 7.2 Standardowe obsBuga wej[cia-wyj[cia - klasy InputStream oraz OutputStream 7.2.1 ObsBuga wej[cia  klasa InputStream 7.2.2 ObsBuga wej[cia  klasa OutputStream 7.2.3 ObsBuga plików 7.3 ObsBuga strumieni tekstu 7.4 Dzielenie strumienia  klasa StreamTokenizer 7.5 Strumienie poza java.io 7.1 Strumienie W celu stworzenia uniwersalnego modelu przepBywu danych wykorzystuje si w Javie model strumieni danych. StrumieD (stream) jest sekwencj danych, zwykle bajtów. Pochodzenie i typ sekwencji danych zale|ny jest od danego [rodowiska. Podstawowe typu strumieni to te zwizane z operacjami wprowadzania danych do programu (operacje wej[cia) i z operacjami wyprowadzania danych poza program (operacje wyj[cia). W Javie do obsBugi operacji wej[cia stworzono klas InputStream, natomiast dla obsBugi operacji wyj[cia stworzono klas OutputStream. StrumieD zwizany jest równie| z typem obszaru (urzdzenia) z/do którego sekwencja danych przepBywa oraz typem danych. Podstawowe obszary (urzdzenia) to np. pami operacyjna, dyski (pliki), sie, drukarka, ekran, itp. Typy danych jakie mog by wykorzystywane przy przesyBaniu danych to np. byte, String, Object, itp. Zgodnie z dystrybucj JDK 1.0 klasy OutputStream oraz InputStream reprezentuj strumienie jako sekwencje bajtów, czyli elementów typu byte. Czsto jednak zachodzi potrzeba formatowania danych strumienia. Mo|na to wykona w Javie korzystajc z ró|nych klas formatujcych dziedziczcych z OutputStream i InputStream. Dobrym przykBadem jest obsBuga danych tekstowych wy[wietlanych na standardowym urzdzeniu wyj[cia. Zgodnie z tym co byBo omawiane wcze[niej klasyczn metod wydruku tekstu w konsoli jest u|ycie polecenia System.out.println(); gdzie out jest obiektem klasy PrintStream, stanowicej klas formatujc bajty sekwencji pochodzcych z OutputStream na tekst. Rozpatrujc dalej ró|norodno[ obsBugi strumieni w Javie nale|y wspomnie o dodatkowych klasach wprowadzonych z wersj JDK 1.1, a mianowicie klasach Reader oraz Writer. Klasy te stanowi analogi do klas InputStream oraz OutputStream, niemniej przygotowane s do obsBugi danych tekstowych (String). W omawianych wcze[niej rozdziaBach u|yto ju| przykBadowej klasy dziedziczcej z klasy Writer, a mianowicie klasy PrintWriter (zamiast PrintStream). Wprowadzenie dodatkowych klas obsBugujcych sekwencje BaDcuchów znaków miaBo na celu ujednolicenie pracy w [rodowisku Javy z tekstem zapisywanym kodowanym w Unicodzie (2 bajty na znak). Dodatkowe, oddzielne klasy strumieni to klasa StreamTokenizer dzielca strumieD tekstowy na leksemy oraz klasa RandomAccessFile obsBugujca pliki zawierajce rekordy o znanych rozmiarach, tak |e mo|na dowolnie porusza si w obrbie rekordów i je modyfikowa. Wa|nym zagadnieniem zwizanym ze strumieniami jest mo|liwo[ zapisu obiektu jako sekwencji bajtów i przesBanie go do programu (metody) dziaBajcej zdalnie. Efekt ten jest uzyskiwany poprzez zastosowanie mechanizmu serializacji i wykorzystania klas ObjectInputStream oraz ObjectOutputStream. 7-3 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  Wszystkie omawiane klasy obsBugujce ró|ne typy strumieni s zdefiniowane w pakiecie java.io. Wykorzystanie strumieni jest powszechne w tworzeniu programów tak wic warto bli|ej zapozna si z podstawowymi klasami je obsBugujcymi. 7.2 Standardowe obsBuga wej[cia-wyj[cia - klasy InputStream oraz OutputStream 7.2.1 ObsBuga wej[cia  klasa InputStream Klasa ta jest klas abstrakcyjn i zawiera podstawowe metody umo|liwiajce odczytywanie i kontrol bajtów ze strumienia. Poniewa| jest to klasa abstrakcyjna nie tworzy si dynamicznie obiektu tej klasy, lecz mo|na go uzyska poprzez odwoBanie si do standardowego wej[cia zainicjowanego zawsze w polu in klasy System, czyli System.in. Inne mo|liwo[ci uzyskania obiektu klasy InputStream to wywoBanie metod zwracajcych referencj do obiektu tego typu np.: metoda getInputStream() zdefiniowana w klasie Socket. Jedyn metod abstrakcyjn (czynic z tej klasy klas abstrakcyjn ) jest metoda read() oznaczajca czytanie kolejnego bajtu ze strumienia wej[cia. PozostaBe metody umo|liwiaj: - odczyt bajtów do zdefiniowanej tablicy: iintt rread((bytte b[[]]));; int read(byte b[]); n ead by e b iintt rread((bytte b[[]],, iintt offffsett,, iintt llengtth));; e int read(byte b[], int offset, int length); n ead by e b n o se n ng h - pominicie okre[lonej liczby bajtów w odczycie: llong skiip((llong n));; long skip(long n); ong sk p ong n - kontrol stanu strumienia (czy s dane): iintt avaiillablle(());; int available(); n ava ab e - tworzenie markerów: boollean marrkSupporrtted(());; konttrrolla czy ttworrzeniie marrkerrów jjestt mo|lliiwe boolean markSupported(); kontrola czy tworzenie markerów jest mo|liwe boo ean ma kSuppo ed kon oa czy wo zen e ma ke ów es mo| we synchrroniized voiid marrk((iintt rreadlliimiitt));; synchronized void mark(int readlimit); synch on zed vo d ma k n ead m synchrroniized voiid rresett(()) synchronized void reset() synch on zed vo d ese - zamknicie strumienia voiid cllose(());; void close(); vo d c ose Prawie wszystkie metody ( poza markSupported() oraz mark()) mog wygenerowa wyjtek, który musi by zadeklarowany lub obsBugiwany w kodzie programu. Podstawow klas wyjtków jest tutaj klasa IOException. Pokazane wy|ej metody read() blokuj dostp tak dBugo, jak dane s dostpne lub wystpi koniec pliku albo wygenerowany zostanie wyjtek. Klasy dziedziczce z klasy InputStream to: 7-4 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  ByteArrayInputStream - definiuje pole bufora bajtów, FileInputStream - umo|liwia odczyt pliku (strumieD z pliku), FilterInputStream - praktycznie kopiuje funkcjonalno[ InputStream celem jej wykorzystania w klasach dziedziczcych z FilterInputStream wprowadzajc dodatkowe narzdzia do obsBugi sekwencji bajtów: BufferedInputStream, CheckedInputStream, DataInputStream, DigestInputStream, InflaterInputStream, LineNumberInputStream, ProgressMonitorInputStream, PushbackInputStream np. DataInputStream umo|liwia programowi odczyt danych zgodnie z podstawowymi formatami zdefiniowanymi w Javie (char, int, long, double, itp.). ObjectInputStream - dokonuje rekonstrukcji obiektu z sekwencji bajtów (stworzonej w wyniku serializacji i zapisu metod writeObject() klasy ObjectOutputStream), PipedInputStream - dokonuje przepBywu danych do odpowiadajcemu obiektowi klasy PipedOutputStream, który jest podawany jako argument konstruktora klasy PipedInputStream, SequenceInputStream, dokonuje logicznej koncentracji strumieni w jeden, StringBufferInputStream - tworzy strumieD z podanego BaDcucha znaków (obiektu String) - klasa ta jest oznaczona w JDK 1.2 jako deprecated poniewa| nie dokonuje wBa[ciwej konwersji znaków na bajty. Postuluje si jej zastpienie klas StringReader. 7.2.2 ObsBuga wej[cia  klasa OutputStream W podobny sposób, niemniej dotyczcy obsBugi wyj[cia, definiowane s klasy dziedziczce z klasy OutputStream. Klasa ta jest równie| klas abstrakcyjn z jedyn abstrakcyjn metod write() zapisujca kolejny bajt do strumienia. Podstawowe metody tej klasy to: void close() - zamknicie strumienia, void flush() - przesuwa buforowane dane do strumienia, void write(byte[] b, int off, int len), void write(byte[] b) - zapisuj dane z tablicy b do strumienia wyj[cia. Klasy dziedziczce z klasy OutputStream to: " ByteArrayOutputStream, " FileOutputStream, " FilterOutputStream, " ObjectOutputStream, " PipedOutputStream. Klasy te obsBuguj strumieD wyj[ciowy a ich funkcjonalno[ jest analogiczna do omawianych wy|ej wersji obsBugujcych wej[cie. PrzykBad 7.1: //Echo.java import java.io.*; 7-5 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  public class Echo{ public static void main(String args[]){ byte b[] = new byte[100]; try{ System.in.read(b); System.out.write(b); System.out.flush(); } catch (IOException ioe){ System.out.println("BBd wej[cia-wyj[cia"); } } }//koniec public class Echo Powy|szy program ukazuje proste zastosowanie strumieni. Pocztkowo wykorzystywany jest istniejcy strumieD wej[cia System.in w celu wczytania danych ze standardowego urzdzenia wej[cia (klawiatura). Dane s wczytywane a| wci[nity zostanie klawisz Enter (koniec danych). Wczytane znaki s zapisywane do bufora b, który to jest nastpnie wykorzystywany do pobrania danych celem wysBania ich do strumienia wyj[cia. Przyjtym w powy|szym przykBadzie strumieD wyj[cia to System.out. Warto zauwa|y, |e wykorzystano metody write() oraz flush() do zapisu danych. W efekcie dziaBania programu otrzymujemy echo (powtórzenie) napisu wprowadzonego z klawiatury. Kolejny przykBad ukazuje mo|liwo[ dostpu do pliku. PrzykBad 7.2: //ZapiszPlany.java: import java.io.*; class Plany implements Serializable{ private int liczbaLegionow; private int liczbaDzial; private String haslo; public void ustaw(int lL, int lD, String h){ this.liczbaLegionow=lL; this.liczbaDzial=lD; this.haslo=h; } public void wyswietl(){ System.out.println("Liczba legionów = "+liczbaLegionow); System.out.println("Liczba dziaB = "+liczbaDzial); System.out.println("HasBo dostpu = "+haslo); } }// koniec class Plany class Nadawca extends Thread{ 7-6 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  private String plikDanych; ZapiszPlany zp; Nadawca(String s, ZapiszPlany zp){ this.plikDanych=s; this.zp=zp; setName("Nadawca"); } public void run(){ byte b[] = new byte[100]; try{ System.out.println("Podaj hasBo"); System.in.read(b); String s= new String(b); System.out.println("Zapisuj do pliku"); Plany p = new Plany(); p.ustaw(1,2,s); ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(plikDanych)); o.writeObject(p); o.flush(); o.close(); } catch (IOException ioe){ System.out.println("BBd wej[cia-wyj[cia"); } zp.ustaw(); } }// koniec class Nadawca class Odbiorca extends Thread{ private String plikDanych; ZapiszPlany zp; Odbiorca(String s, ZapiszPlany zp){ this.plikDanych=s; this.zp=zp; setName("Odbiorca"); } public void run(){ while( (!(this.isInterrupted())) && (zp.pobierz()) ){ } try{ System.out.println("Odczyt"); ObjectInputStream i = new ObjectInputStream(new FileInputStream(plikDanych)); Plany p = (Plany) i.readObject(); p.wyswietl(); i.close(); } catch (Exception e){ System.out.println("BBd wej[cia-wyj[cia lub brak klasy Plany"); } } 7-7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  }// koniec class Odbiorca public class ZapiszPlany{ static boolean czekaj=true; synchronized void ustaw(){ czekaj=false; } synchronized boolean pobierz(){ return czekaj; } public static void main (String args[]){ ZapiszPlany z = new ZapiszPlany(); Nadawca n = new Nadawca("plany.txt",z); Odbiorca o = new Odbiorca("plany.txt",z); o.start(); n.start(); } }//koniec public class ZapiszPlany Powy|szy program demonstruje zastosowanie obsBugi strumieni dostpu do plików oraz wykorzystanie serializacji obiektów. Stworzono w kodzie cztery klasy. Pierwsza zawiera definicje zbioru pól (dane) oraz metod dostpu do nich. Klasa implementuje interfejs Serializable w celu umo|liwienia zapisu obiektu do strumienia. Kolejne dwie klasy opisuj zachowanie wtków generujcego zapis danych i odczytujcego zapis danych. W klasie Nadawca zawarto kod wczytujcy zestaw znaków w klawiatury, który jest przypisywany do pola obiektu klasy Plany. Nastpnie tworzony jest strumieD dostpu do pliku o podanej nazwie sformatowany do przesyBania obiektów. Zapis do bufora i przesBanie do strumienia odbywa si poprzez metody writeObject() oraz flush(). Po zakoDczeniu procesu zapisu danych do pliku powiadamiany jest drugi wtek, opisany w klasie Odbiorca. Zapisany obiekt jest odczytywany poprzez metod readObject() a nastpnie jest wykonywana jedna z metod obiektu wy[wietlajca stan danych. Jak wida przesBanie przez strumieD obiektów jest ciekawym rozwizaniem i umo|liwia tworzenie rozproszonych aplikacji. 7.2.3 ObsBuga plików Dostp do plików zaprezentowany wcze[niej wykorzystywaB klasy FileInputStream i FileOutputStream. Konstruktory tych klas umo|liwiaj inicjacje strumienia poprzez podanie jako argumentu albo nazwy pliku poprzez obiekt typu String lub poprzez podanie nazwy logicznej reprezentowanej przez obiekt klasy File. Klasa File opisuje abstrakcyjn reprezentacj [cie|ek dostpu do plików i katalogów. Zcie|ka dostpu do pliku mo|e by sklasyfikowana ze wzgldu na jej zasig lub ze wzgldu na [rodowisko dla którego jest zdefiniowana. W pierwszym przypadku dzieli si [cie|ki dostpu na absolutne i relatywne. Absolutne to te, które podaj adres do pliku wzgldem gBównego korzenia systemu plików danego [rodowiska. Relatywne to te, które adresuj plik wzgldem katalogu bie|cego. Druga klasyfikacja rozró|nia [cie|ki dostpu pod wzgldem [rodowiska dla którego jest ona zdefiniowana, co w praktyce dzieli [cie|ki dostpu na te zdefiniowane dla systemów opartych na UNIX i 7-8 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  na te zdefiniowane dla systemów opartych na MS Windows (wBasno[ systemu o nazwie file.separator). PrzykBady: a.) absolutna [cie|ka dostpu: UNIX: /utl/software/java/projekty MS Windows: c:\utl\softare\java\projekty b.) relatywna [cie|ka dostpu: UNIX: java/projekty MS Windows: java\projekty. Tworzc obiekt klasy File dokonywana jest konwersja BaDcucha znaków na abstrakcyjn [cie|k dostpu do pliku (abstrakcyjna [cie|ka dostpu do pliku jest tworzona wedBug okre[lonych reguB podanych w dokumentacji API). Metody klasy File umo|liwiaj liczne kontrol podanej [cie|ki i plików (np. isFile(), isDirectory(), isHidden, canRead(), itp.) oraz dokonywania konwersji (np. getPath(), getParent(), getName(), toURL(), itp.) i wykonywania prostych operacji (list() mkdir(), itp.). Uwaga! Nale|y pamita, |e zapis tekstowy [cie|ki dostpu dla [rodowiska MS Windows musi zawiera podwójny separator, gdy| pojedynczy znak umieszczony w inicjacji BaDcucha znaków oznacz pocztek kodu ucieczki, np.  c:\\java\\kurs\\wyklad\\np". PrzykBad 7.3: // PobierzDane.java: import java.io.*; public class PobierzDane{ public static void main(String args[]){ File f = new File("DANE1"); if (f.mkdir()) { File g = new File ("."); String s[] = g.list(); for (int i =0; i<s.length; i++){ System.out.println(s[i]); } } else { System.out.println("BBd operacji I/O"); } } }//koniec public class PobierzDane Program PobierzDane ukazuje ciekaw wBasno[ obiektu File. Otó| stworzenie obiektu tej klasy nie oznacza otwarcia strumienia czy stworzenia uchwytu do pliku. Obiekt klasy File mo|e wic by stworzony praktycznie dla dowolnej nazwy [cie|ki. W prezentowanym przykBadzie utworzono katalog o nazwie  DANE1 , a nastpnie 7-9 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  dokonano wydruku plików i katalogów zawartych pod aktualnym adresem [cie|ki (pod tym, z którego wywoBano program java). Prac z plikami o swobodnym dostpie uBatwia zastosowanie innej klasy obsBugujcej operacje wej[cia-wyj[cia, a mianowicie klasy RandomAccessFile. Zdefiniowana jest w klasie obsBuga plików zawierajcych rekordy o znanych rozmiarach, tak |e mo|na dowolnie porusza si w obrbie rekordów i je modyfikowa. Dane w pliku s interpretowane jako dane w macierzy do której dostp jest mo|liwy poprzez odpowiednie ustawienie gBowicy czytajcej czy zapisujcej dane. Zdefiniowano w tej klasie metody przesuwania gBowicy (getFilePointer(), seek()) oraz szereg metod czytania i zapisu ró|nych typów danych. 7.3 ObsBuga strumieni tekstu W zwizku z problemem wynikajcym z konwersji znaków Javy (Unicode) na bajty i odwrotnie wystpujcych we wczesnych (JDK 1.0) realizacjach klas obsBugi strumieni poczwszy od wersji JDK1.1 wprowadzono dodatkowe klasy Reader i Writer. Obie abstrakcyjne klasy s analogicznie skonstruowane (dziedziczenie z klasy Object i deklaracja metod) jak klasy InputStream oraz OutputStream. Dziedziczce z nich klasy umo|liwiaj prost i formatowan obsBug sekwencji tekstu: Reader: BufferedReader  buforuje otrzymywany tekst, LineNumberReader  przechowuje dodatkowo informacje o numerze linii CharArrayReader  wprowadza bufor znaków do odczytu, FilterReader  klasa abstrakcyjna formatowania danych tekstowych, PushbackReader  przygotowuje dane odesBania do strumienia, InputStreamReader  czyta bajty zamieniajce je na tekst wedBug podanego systemu kodowania znaków, FileReader  odczyt danych tekstowych z pliku dla domy[lnego systemu kodowania znaków, poprzez podanie [cie|ki zale|nej systemowo (String) lub abstrakcyjnej (File) PipedReader  obsBuga potoku (zwizanie z klas odczytujc), StringReader  obsBuga strumienia pochodzcego od obiektu klasy String. Konstrukcja klasy Writer jest analogiczna do Reader, z tym, |e definiowany jest zapis zamiast odczytu. Podobnie wyglda struktura klas dziedziczcych z Writer: Writer: BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, FileWriter PipedWriter, PrintWriter, - formatowanie danych do postaci tekstu (analogiczna do PrintStream) 7-10 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  StringWriter Odczyt danych odbywa si poprzez zastosowanie metod read() lub readLine() natomiast zapis danych do strumienia poprzez wykorzystanie metod write(). Zastosowanie klas dziedziczcych z Reader i Writer ma dwie zasadnicze zalety: wBa[ciwa konwersja bajtów na znaki w Unicodzie i odwrotnie oraz mo|liwo[ zdefiniowania systemu kodowania znaków. W celu zobrazowania sposobu korzystania z tych klas warto zapozna si z nastpujcym przykBadem: PrzykBad 7.4: //Czytaj.java: import java.io.*; /*Plik  plik.txt powinien zawiera polskie znaki wprowadzone w kodzie Cp1250: "[óB|zD"; */ public class Czytaj{ public static void main(String args[]){ String s; char zn[] = new char[9]; try{ InputStreamReader r = new InputStreamReader((new FileInputStream("plik.txt")), "Cp1250"); r.read(zn,0,zn.length); s = new String(zn); System.out.println(s); OutputStreamWriter o = new OutputStreamWriter((new FileOutputStream("plik1.txt")),"Cp852"); o.write(s,0,s.length()); o.flush(); } catch (Exception e){} } }// koniec public class Czytaj Prezentowany program tworzy dwa strumienie: jeden wej[cia czytajcy plik tekstowy zapisany wedBug strony tekstowej Cp1250 (Windows PL) i drugi wyj[cia zapisujcy nowy plik wyj[ciowy tekstem wedBug strony kodowej Cp852 (DOS PL). Oczywi[cie nazwy plików jak i nazwy stron kodowych mo|na zmienia dla potrzeb wiczeD i w ten sposób dokonywa konwersji plików z np. Cp1250 na ISO8859-2. W celu weryfikacji dziaBania powy|szego programu nale|y otworzy plik o nazwie  plik.txt w edytorze obsBugujcym Cp1250 a plik o nazwie  plik1.txt w edytorze obsBugujcym Cp852. W przypadku gdy nie ma konieczno[ci zmiany systemu kodowania znaków warto wykorzystywa klasy FileReader oraz FileWriter zamiast InputStreamReader i OutputStreamWriter. Dla poprawienia efektywno[ci pracy istotne jest równie| buforowanie czytanych danych co w rezultacie prowadzi do nastpujcego wywoBania obiektu: BufffferredReaderr brr = new BufffferredReaderr((new FiilleReaderr((  plliik..ttxtt  ))));; BufferedReader br = new BufferedReader(new FileReader( plik.txt )); Bu e edReade b = new Bu e edReade new F eReade p k x 7-11 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  7.4 Dzielenie strumienia  klasa StreamTokenizer Na zakoDczenie omawiania klas zwizanych z obsBug strumieni warto zapozna si z klas StreamTokenizer, dzielca strumieD tekstowy na leksemy. Klasa ta daje wic swoist funkcjonalno[ wykrywanie elementów strumienia i umieszczania ich w tablicy. Wskazujc znak oddzielajcy leksemy mo|na dokona przeformatowania przesBanego tekstu (np. podzieli [cie|k dostpu, dokona detekcji liczb w tek[cie, itp.). Pobranie leksemu z tablicy odbywa si poprzez wywoBanie metody nextToken(). Poni|szy przykBad ilustruje stosowanie klasy StreamTokenizer: PrzykBad 7.5: //FormatujStrumien.java: import java.io.*; public class FormatujStrumien{ public static void main(String args[]){ System.out.println("Podaj tekst zawierajcy znak : ."); Reader r = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer st = new StreamTokenizer(r); st.ordinaryChar('.'); st.ordinaryChar('-'); st.ordinaryChar('A'); try{ while (st.nextToken() != StreamTokenizer.TT_EOF){ if (st.ttype==StreamTokenizer.TT_WORD){ System.out.println(new String(st.sval)); } } }catch (IOException ioe){ System.out.println("BBd operacji I/O"); } } }//koniec public class FormatujStrumien W powy|szym przykBadzie stworzono obiekt klasy Reader na podstawie standardowego strumienia wej[cia, który jest nastpnie wykorzystany przy inicjowaniu obiektu klasy StreamTokenizer. Poniewa| w zbiorze domy[lnych znaków dzielcych strumieD nie ma znaków  . oraz  - dodano te znaki za pomoc metody ordinaryChar(). Dodatkowo ustawiono znak  A jako znak dzielcy strumieD. Nastpnie w bloku instrukcji warunkowej uruchomiona jest ptla dziaBajca tak dBugo a| nie wystpi koniec pliku (a| nie wci[nity zostanie kod CTRL-Z a nastpnie 7-12 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  Enter). W ptli pobierany jest kolejny wczytywany element, sprawdzany jest jego typ i je[li jest to sBowo (tekst) to drukowany jest na ekranie tekst bdcy warto[ci pola sval obiektu klasy StreamTokenizer. ObsBuga programu polega na wprowadzaniu tekstu ze znakami go dzielcymi i koDczeniu linii wciskajc Enter. W ten sposób linia po linii mo|na analizowa wprowadzany tekst. Koniec pracy programu jest wymuszany sekwencj koDca pliku CTRL-Z i Enter. Warto zauwa|y, |e istnieje klasa StringTokenizer o podobnym dziaBaniu, której argumentem nie jest jednak strumieD a obiekt klasy String. 7.5 Strumienie poza java.io W JDK istniej jeszcze inne strumienie zdefiniowane poza pakietem java.io. PrzykBadowo w pakiecie java.util.zip zdefiniowano szereg klas strumieni obsBugujcych kompresj w formie ZIP i GZIP. Podstawowe klasy strumieni tam przechowywane to: CheckedInputStream CheckedOutputStream DeflaterOutputStream GZIPInputStream GZIPOutputStream InflaterInputStream ZipInputStream ZipOutputStream PrzykBadowo w celu dokonania kompresji pliku metod GZIP mo|na zastosowa nastpujcy kod: PrzykBad 7.6: //Kompresja.java: import java.io.*; import java.util.zip.*; public class Kompresja{ public static void main(String args[]){ String s; byte b[] = new byte[100]; for (int i=0; i<100; i++){ b[i]=(byte) (i/10); } try{ FileOutputStream o = new FileOutputStream("plik2.txt"); o.write(b); o.flush(); o.close(); 7-13 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  FileOutputStream fos = new FileOutputStream("plik2.gz"); GZIPOutputStream z = new GZIPOutputStream(new BufferedOutputStream(fos)); z.write(b,0,b.length); z.close(); } catch (Exception e){} } }// koniec public class Kompresja W prezentowanym kodzie tworzona jest tablica bajtów wypeBniana kolejnymi warto[ciami od 1 do 10. Tablica ta jest nastpnie przesyBana do strumieni wyj[ciowych raz bezpo[rednio do pliku, drugi raz poprzez kompresj metod GZIP. W wyniku dziaBania programu uzyskuje si dwa pliki: bez kompresji  plik2.txt i z kompresj  plik2.gz . W pakietach standardowych jak i w pakietach bdcych rozszerzeniem bibliotek Javy mo|na znalez jeszcze szereg innych strumieni zwizanych z przesyBaniem danych (np. w kryptografii czy w obsBudze portów). Ze wzgldu na liczne potrzeby wykorzystywania portów szeregowych i równolegBych komputera Sun opracowaB pakiet rozszerzenia Javy o nazwie javax.comm. Pakiet ten umo|liwia obsBug portów poprzez strumienie. Poni|szy przykBad ukazuje prób zapisu do portu szeregowego. PrzykBad 7.7: //ZapiszPort.java: import java.io.*; import java.util.*; import javax.comm.*; public class ZapiszPort { static SerialPort port; static CommPortIdentifier id; static Enumeration info; static String dane = "Tu Czerwona Jarzbina - odbiór \n"; static OutputStream os; public static void main(String args[]) { info = CommPortIdentifier.getPortIdentifiers(); while (info.hasMoreElements()) { id = (CommPortIdentifier) info.nextElement(); if (id.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (id.getName().equals("COM1")) { try { port = (SerialPort) id.open("ZapiszPort", 2000); } catch (PortInUseException e) {} try { 7-14 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  RozdziaB 7 Jacek RumiDski - Jzyk JAVA  Jacek RumiDski - Jzyk JAVA  os = port.getOutputStream(); } catch (IOException ioe) {} try { port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException ue) {} try { os.write(dane.getBytes()); } catch (IOException e) {} } } } } }// koniec public class ZapiszPort 7-15

Wyszukiwarka

Podobne podstrony:
operacje wejscia wyjscia 13
operacje wejscia wyjscia 7
operacje wejscia wyjscia 8
04 operacje wejscia wyjscia
operacje wejscia wyjscia 10
operacje wejscia wyjscia 3
operacje wejscia wyjscia 6
operacje wejscia wyjscia 1
operacje wejscia wyjscia 9
operacje wejscia wyjscia 0
operacje wejscia wyjscia 5
operacje wejscia wyjscia 2
operacje wejscia wyjscia 12
operacje wejscia wyjscia 11
wejscie wyjscie
Porty wejścia wyjścia

więcej podobnych podstron