SYSTEM WEJCIAWYJCIA W JAVIE Autor Jakub Piasecki Data
SYSTEM WEJŚCIA-WYJŚCIA W JAVIE Autor: Jakub Piasecki Data powstania: Grudzień 2003
File- Klasa § Reprezentuje ona albo nazwę konkretnego pliku, albo nazwę zbioru plików czyli katalogu n Java traktuje katalogi i pliki w podobny sposób n Korzystamy z biblioteki java. io. *; n String list()- metoda która w przypadku katalogów zwraca tablice z nazwami plików znajdujących się w danym katalogu
Przykładowy kod (katalogi I) n Wypisanie zawartości katalogu: File sciezka = new File("Folder"); String[] lista = sciezka. list(); for(int i=0; i<lista. length; i++) System. out. println(lista[i]);
File- metody n n n n n getname()- zwraca nazwę pliku getpath()- zwraca ścieżkę pliku get. Absolute. Path()-zwraca pełną ścieżkę pliku get. Parent()-zwraca ścieżkę nadrzędną String boolean boolean exists()– czy istnieje can. Write()- możliwość zapisu can. Read()- możliwość czytania is. File()- czy plik is. Directory()- czy katalog
File- metody c. d. n n n boolean rename. To(File new. Name)- zmiana nazwy boolean mkdirs()- tworzenie ścieżki o dowolnej złożonosci boolean delete()- kasowanie pliku long length()– długość pliku long last. Modified()– ostania modyfikacja
Przykładowy kod (katalogi II) n Tworzenie katalogu i zmiana jego nazwy File sciezka= new File("c: /katalog 1"); File nowa. Sciezka=new File("c: /katlog 2"); //tworzymy katalog sciezka. mkdirs(); //zmieniamy jego nazwę sciezka. rename. To(nowa. Sciezka);
I/O- informacje podstawowe n n n Java wykorzystuje pojęcie strumienia (ang. stream) Strumień- reprezentacja dowolnego źródła danych, jako obiektu zdolnego do wysyłania i odbierania porcji danych W Javie 1. 1 zaszły istotne zmiany w stosunku do wcześniejszych wersji (cel: obsługa standardu Unicode) Rozróżniamy dwa rodzaje strumieni: tekstowe i binarne Do obsługi tekstowych korzystamy z hierarchii klas Reader i Writer Do obsługi binarnych korzystamy z hierarchii klas Input. Stream i Output. Stream
Reader i Writer n n Używamy do obsługi strumieni tekstowych Powstały w celu obsługi standardu Unicode Podział na dwie podstawowe klasy Reader oraz Writer, które posiadają metody read() i write() pozwalające na operacje czytania i zapisu bajtu lub tablicy bajtów(to samo Input. Stream i Output. Stream) Nie korzystamy z tych metod bezpośrednio. Wykorzystują je klasy dziedziczące, które służą do obsługi konkretnych źródeł.
Reader- możliwe źródła n n n Tablica bajtów Obiekt String Plik Potok Sekwencja Strumieni Inne źródła(np. połączenia internetowe)
Reader- Użyteczne Podklasy Klasa Działanie Char. Array. Reader Odczyt bajtów z tablicy Argument Konstruktora Tablica, z której czytamy bajty String. Reader Konwertuje String do obiektu typu Reader Obiekt typu String File. Reader Odczyt informacji z pliku Obiekt File Filter. Reader Dostarcza interfejs dla dekoratorów, poszerzających możliwości klas Reader Obiekt Reader
Reader- Dekoratory klas n n Klasy Reader używamy w połączeniu z dekoratorami tworząc użyteczny interfejs Najczęściej stosowany to: Buffered. Reader- używamy go aby zapobiec fizycznemu odczytowi za każdym żądaniem kolejnych danych. Jako argument przyjmuje obiekt typu Reader. Zastosowanie go znacznie zwiększa wydajność
Przykładowy kod (czytanie z pliku)(1/2) n n n Czytanie z pliku i wyświetlenie na ekranie Konstrukcja z zagnieżdżoną instrukcją try pozwala na uniknięcie błędów, szczególnie wyróżnione w przykładzie zamknięcie strumienia niezależnie od błędów występujących podczas przetwarzania W celu większej przejrzystości w kolejnych przykładach strumienie będą zamykane w głównym bloku try. Należy jednak pamiętać, że przy pisaniu programu należy zastosować pełną konstrukcję. kod
Przykładowy kod (czytanie z pliku)(2/2) try{ //tworzymy strumień Reader z obiektu File i dekorujemy go //za pomocą Buffered. Reader in = new Buffered. Reader(new File. Reader(plik)); String s; //czytamy kolejne linie pliku za pomocą readline() try{ while((s=in. read. Line())!=null) System. out. println(s); }catch(IOException e 1){ System. err. println("Błąd przy przetwarzaniu"); }finally{ in. close(); //zamknięcie strumienia!!! } }catch(File. Not. Found. Exception e 2{ System. err. println("Brak pliku: "+ plik); }
Writer- Użyteczne Podklasy Klasa Char. Array. Writer File. Writer Działanie Argument Konstruktora Tworzy bufor w pamięci Opcjonalnie rozmiar w którym umieszczone bufora są dane wysyłane do strumienia String Wysyła informacje do pliku reprezentujący nazwę pliku lub obiekt File
Writer- Zapis do strumieni n n Print. Writer- za pomocą tej klasy możemy zrealizować zapis danych w formie nadającej się do przeglądania. Posiada ona dwie ważne metody print() i println() Buffered. Writer- za pomocą tego dekoratora możemy zwiększyć wydajność zapisu. Jako argument przyjmuje on obiekt typu Writer
Przykładowy kod (zapis do pliku- prawidłowe zamknięcie strumienia) Odczytanie danych z klasy String i zapis do pliku File plik = new File("test 1. txt"); String s="Pierwsza Linia n. Druga Linia n. Koniec"; String s 2; Buffered. Reader in = new Buffered. Reader(new String. Reader(s)); try{ Print. Writer out = new Print. Writer( new Buffered. Writer(new File. Writer(plik))); //czytamy ze strumienia in i zapisujemy do strumienia out while((s 2=in. read. Line())!=null) out. println(s 2); out. close(); }catch(IOException e 1){} } n
Input. Stream i Output. Stream n n Spełniały role głównych klas I/O zanim powstały klasy Reader i Writer w Javie 1. 1 Posiadają podklasy analogiczne do podklas Reader i Writer, których nazwy w miejscu wyrazów „Reader” i „Writer” mają wyrazy „Input. Stream” i „Output. Stream” np. File. Input. Stream zamiast File. Reader Wciąż używa się niektórych podklas do operacji zorientowanych bajtowo. Szczególnie Data. Input. Stream i Data. Output. Stream Istnieje możliwość konwersji obiektów tego typu do obiektów Reader i Writer za pomocą adapterów Input. Stream. Reader oraz Output. Stream. Writer
Data. Input. Stream i Data. Output. Stream n n n Są podklasami Input. Stream i Output. Stream Data. Output. Stream umożliwia zapis i danych w postaci która może być odczytana jedynie za pomocą Data. Input. Stream Umożliwiają odczyt i zapis danych podstawowych niezależnie od platformy systemowej Stosują metody typu: read. Float(), read. Double(), write. Int() Przy wczytywaniu danych trzeba znać ich kolejność w strumieniu write. UTF(), read. UTF()- metody stosowane do zapisu i odczytu obiektów String
Przykładowy kod (zapis do pliku i odzyskiwanie danych) n zapis do pliku i odzyskiwanie danych try{ Data. Output. Stream out = new Data. Output. Stream(new File. Output. Stream("Data. dat")); out. write. Double(13. 1231); out. write. UTF("to jest obiekt string"); out. close(); //to był zapis, teraz odczyt Data. Input. Stream in = new Data. Input. Stream(new File. Input. Stream("Data. dat")); System. out. println(in. read. Double()); System. out. println(in. read. UTF()); in. close(); }catch(IOException e 1){}; }
Standardowe wejście-wyjście § Termin odnosi się do koncepcji wywodzących się z Unixa, stosowanej potem w innych systemach operacyjnych § Dane wejściowe mogą pochodzić ze standardowego wejścia, a dane wyjściowe program może wysyłać na standardowe wyjście i standardowe wyjście błędów § Wyjście jednego programu może być wejściem drugiego § System. in, System. out , System. err- obiekty § Obiekt System. out jest standardowo opakowany w obiekt Printstream § Dwa pozostałe obiekty należy samemu opakować w celu użycia § System. in jest obiektem hierarchii Input. Stream dlatego aby skonwertować go do Reader używamy adaptera Input. Stream. Reader
Przykładowy kod (czytanie ze standardowego wejścia) czytanie danych ze standardowego wejścia i zapis do obiektu String try{ //konwertujemy System. in do obiektu Reader Input. Stream. Reader ir= new Input. Stream. Reader(System. in); Buffered. Reader in = new Buffered. Reader(ir); String s 1, s 2; //wprowadzenie pustego wiersza kończy pętlę while((s 2=in. read. Line())!=null && s 2. length()!=0) s 1+=s 2; System. out. println(s 1); }catch(IOException e 1){} §
Przekierowanie Standardowego wejścia-wyjścia n n n Używamy np. kiedy chcemy przekierować do pliku dane które normalnie byłyby skierowane na konsole set. In(Input. Stream), set. Out(Print. Stream), set. Err(Print. Stream)- metody klasy System służące do przekierowań Operacje przekierowań to operacje bajtowe dlatego używamy klas Input i Output. Stream
Przykładowy kod (przekierowanie standardowego wejścia do pliku) n przekierowanie standardowego wyjścia do pliku try{ Print. Stream moje. Out= new Print. Stream( new Buffered. Output. Stream( new File. Output. Stream("test. txt"))); System. set. Out(moje. Out); System. out. println("To będzie zapisane w pliku"); moje. Out. close(); System. set. Out(System. out); } catch(IOException e 1){}
Random. Acces. File- Klasa n n n Jest używana do obsługi plików zawierających rekordy o znanym rozmiarze Jest to zupełnie oddzielna klasa nie korzysta z funkcji Input i Output. Stream Swobodny dostęp- możemy poruszać się w pliku „do przodu” i „w tył” seek()-metoda pozwalająca na przemieszczenie się do danego miejsca length()- maksymalna długość pliku Jako drugi argument konstruktora przyjmuje tryb w jakim otieramy plik "rw"- zapis i odczyt lub "r"- tylko zapis
Przykładowy kod (odczyt z plików o swobodnym dostępie) § Zapis i odczyt z plików o swobodnym dostępie try{ Random. Access. File rf = new Random. Access. File("test. dat", "rw"); for(int i=0; i<10; i++) rf. write. Int(i); rf. close(); rf = new Random. Access. File("test. dat", "rw"); rf. seek(4*5); //write. Int wstawi 13 w miejsce 5 rf. write. Int(13); rf. close(); rf = new Random. Access. File("test. dat", "rw"); for(int i=0; i<10; i++) System. out. println(rf. read. Int()); rf. close(); }catch(IOException e 1){}; }
Properties n n n Mogą być użyte do zapisywania i wczytywania ustawień przy każdym uruchomieniu programu Properties- obiekt składa się z par klucz/wartość zapisanych w postaci String Możemy skierować zawartość obiektu do strumienia(pociąga to za sobą możliwość zapisu do pliku) Możemy do obiektu Properties skierować zawartość strumienia(wczytanie z pliku) Wygodny system umożliwiający w prosty sposób konfigurację ustawień programu Poprzez prostą modyfikację wartości par klucz/wartość w pliku możemy łatwo zmienić konfigurację
Properties -metody n n n load(Input. Stream in)-wczytanie zawartości ze strumienia store(Output. Stream out, String nagłowek)- zapis wartości do strumienia dodawany jest nagłówek get. Property(String klucz)- zwraca wartość dla danego klucza set. Property(String klucz, String wartość)ustawienie wartości dla danego klucza Możliwe jest stworzenie wartości domyślnych, które możemy wczytać w razie braku wartości dla danego klucza w danym obiekcie Properties (odsyłam do dokumentacji Javy)
Przykładowy kod (ustawienie wartości Properties zapis i wczytanie z pliku) String user. Login; Properties props 1= new Properties(); props 1. set. Property("login", "piasecki"); props 1. set. Property("nr_grupy", "5"); try{ File. Output. Stream out =new File. Output. Stream("konfig. txt"); props 1. store(out, "--Plik Konfiguracyjny--"); //zapis wartości out. close(); }catch(IOException e){} Properties props 2= new Properties(); try{ File. Input. Stream in =new File. Input. Stream("konfig. txt"); props 2. load(in); //wczytanie wartości in. close(); }catch(IOException e){} user. Login=props 2. get. Property("login"); System. out. println("User Login: "+user. Login);
Przykładowy plik konfiguracyjny § Zawartość: #--Plik Konfiguracyjny-#Thu Dec 04 21: 10: 26 CET 2003 login=piasecki nr_grupy=5
System Properties n n Zastępują pomysł zmiennych środowiskowych specyficznych dla każdej platformy na której uruchamiamy programy Java System. get. Properties()-metoda zwraca obiekt Properties get. Property()- zwraca String reprezentujący wartość danej właściwości (ang. property) property. Names()-wywołana na obiekcie typu Properties zwraca typ wyliczeniowy
Przykładowy kod (użycie System. Propeties) § Wypisanie na ekran wartości System. Properties props = System. get. Properties(); Enumeration prop. Nazwy =props. property. Names(); while (prop. Nazwy. has. More. Elements()){ String prop. Nazwa =(String)prop. Nazwy. next. Element(); String property =(String)props. get. Property(prop. Nazwa); System. out. println("Property "+prop. Nazwa+": "+property); }
Properties- wynik § Niektóre properties uzyskane za pomocą propgramu Property java. runtime. name: Java(TM) 2 Runtime Environment, Standard Edition Property sun. boot. library. path: C: Program FilesJava. SoftJRE1. 3. 1_09bin Property java. vm. version: 1. 3. 1_09 -b 03 Property java. vm. vendor: Sun Microsystems Inc. Property java. vendor. url: http: //java. sun. com/ Property java. vm. specification. name: Java Virtual Machine Specification Property user. dir: E: eclipse-SDK-2. 1. 1 -win 32eclipseworkspacePliki Property java. runtime. version: 1. 3. 1_09 -b 03 Property java. io. tmpdir: C: DOCUME~1KubaUSTAWI~1Temp Property java. vm. specification. vendor: Sun Microsystems Inc. Property os. name: Windows XP Property java. library. path: C: Program FilesJava. SoftJRE1. 3. 1_09bin; . ; C: WINDOWSSystem 32; C: WINDOWSsy stem 32; C: WINDOWSSystem 32 Wbem Property java. specification. name: Java Platform API Specification Property java. class. version: 47. 0 Property os. version: 5. 1 Property user. home: C: Documents and SettingsKuba Property java. home: C: Program FilesJava. SoftJRE1. 3. 1_09 Property user. region: PL Property sun. cpu. isalist: pentium i 486 i 386
Sockets n n n Socket- jest jedną z „końcówek” dwustronnej komunikacji pomiędzy dwoma programami działającymi w sieci. Jest związany z numerem portu i IP komputera więc warstwa TCP może zidentyfikować aplikację do której przesyłane są dane Używamy ich kiedy chcemy stworzyć model komunikacji pomiędzy dwoma programami w sieci np. aplikację typu klientserwer po każdej stronie znajduje się soket, do którego klient i serwer mogą zapisywać i z którego mogą odczytywać informacje Biblioteka java. net dostarcza dwie klasy Socket i Server. Socket- które są odpowiedzialne za połączenie po stronie klienta i serwera Można z niego czytać jak ze strumienia
Wykorzystane Materiały n n n „Thinking in Java” Bruce Eckel „The Java. TM Tutorial” Copyright 1995 -2003 Sun Microsystems „ Java. TM Programming Language” Copyright 2002 Sun Microsystems
Koniec
- Slides: 35