Java niezbędnik programisty spotkanie nr 11. Importy statyczne, wejście/wyjście, wyrażenia regularne, serializacja



Podobne dokumenty
Strumienie i serializacja

Programowanie obiektowe

Programowanie obiektowe

Wykład 4: Wejście/wyjście: strumienie Java

Język JAVA podstawy. Wykład 6, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

STRUMIENIE DANYCH, SERIALIZACJA OBIEKTÓW

Programowanie obiektowe

Przygotował: Jacek Sroka 1. Java SE. Strumienie

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

1 Klasa File. 2 Writer. Programowanie w j zyku Java - Adam Krechowicz. Klasa File zapewnia podstawowe operacje na plikach

Podstawy otwartych języków programowania Wyjątki i strumienie I/O

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Programowanie obiektowe

Programowane refleksyjne i serializacja

Rozdział 7 Strumienie, operacje wejścia-wyjścia

JAVA I SIECI. MATERIAŁY:

Wykład 2: Podstawy Języka

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Programowanie Obiektowe (Java)

KOMUNIKACJA MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

Wykład 10: Wejście i Wyjście

Wykład 7: Pakiety i Interfejsy

K O M U N I K A C J A MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

Java. Programowanie Obiektowe Mateusz Cicheński

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Języki i metody programowania Java INF302W Wykład 4

Inynieria oprogramowania Lecture XXX. Java TM cz IV: IO. Bartosz Walter

STRUMIENIE TEKSTOWE WEJŚCIOWE WPROWADZANIE DANYCH STRUMIENIE BAJTOWE, STRUMIENIE TEKSTOWE

Java niezbędnik programisty spotkanie nr 3. Modyfikatory, jednostki kompilacji, tworzenie/inicjalizacja, odśmiecanie/ finalizacja...

Programowanie obiektowe

Podstawy i języki programowania

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Strumienie, pliki. Sortowanie. Wyjątki.

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie w języku Java WYKŁAD

Programowanie obiektowe

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Kurs programowania. Wykład 10. Wojciech Macyna. 05 maja 2016

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Dokumentacja do API Javy.

Platformy Programistyczne Zagadnienia sieciowe i wątki

Biblioteki wejścia/wyjścia. Strumienie we/wy (I/O)

Bezpieczne uruchamianie apletów wg

Programowanie w Internecie. Java

Pakiety i interfejsy. Tomasz Borzyszkowski

WSNHiD, Programowanie 2, Lab. 3. Trwałość danych

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

Definiowanie własnych klas

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Języki i metody programowania Java. Wykład 2 (część 2)

Wywoływanie metod zdalnych

Programowanie w Javie wykład 9 Klasy wewnętrzne, klasy anonimowe Klasy opakowujące

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

sieć 4) Mechanizm RMI jest zazwyczaj wykorzystywany w rozwiązaniach typu klient-serwer.

MATERIAŁY POMOCNICZE DO ĆWICZENIA 3 Klasy i obiekty; atrybuty i metody

Programowanie w Javie Lista nr 1. Wybieramy kategorię Java, a wśród Projektów Java Application i [NEXT]

Komunikacja z użyciem gniazd aplikacje klient-serwer

Klasy abstrakcyjne, interfejsy i polimorfizm

JAVA W SUPER EXPRESOWEJ PIGUŁCE

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Materiały do laboratorium I

Programowanie rozproszone w języku Java

Programowanie w Javie - wykład 2

Wykład 6 Dziedziczenie cd., pliki

Podstawy programowania obiektowego

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Wprowadzanie danych z klawiatury. Wyjątki związane z wprowadzaniem danych, przekroczeniem rozmiaru tablicy, dzieleniem przez zero itd.

Podstawy obiektowości

Język JAVA podstawy. Wykład 6, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie obiektowe

1. Co można powiedzieć o poniższym kodzie (zakładając, że znajduje się on w jednym pliku A.java)?

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie współbieżne Laboratorium nr 11

Programowanie obiektowe

Podejście obiektowe do budowy systemów rozproszonych

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Aplikacje RMI

Przykłady interfejsu TCP i UDP w Javie

I/O (STRUMIENIE, PLIKI,...)

Programowanie obiektowe

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

1 Atrybuty i metody klasowe

Wywoływanie metod zdalnych

Programowanie obiektowe

Programowanie obiektowe

dr Krzysztof Podlaski

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Remote Method Invocation 17 listopada 2010

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

JAVA- wykład 2 Klasy

Programowanie w Javie - wykład 3

Programowanie w środowisku graficznym- wykład 2 Java - Klasy

Transkrypt:

Java niezbędnik programisty spotkanie nr 11 Importy statyczne, wejście/wyjście, wyrażenia regularne, serializacja 1

Importowanie składowych statycznych Opracował Import static java.lang.system.out; //import static java.lang.system.out.println; //tylko statyczne składowe public class Test { public static void main(string[] args) { out.println("witaj świecie!"); Działa dla metod, atrybutów i klas. Klasy można też importować w zwykły sposób: import java.lang.character.subset; Stosować jeżeli składowa jest używana co najmniej 3 razy. Typowe przykłady import static java.util.arrays.sort; import static java.lang.math.*; import static mójpakiet.mójtypwyliczeniowy.*; 2

Pełna nazwa klasy jest konieczna Trzeba podać pełną nazwę klasy, z której są importowane statyczne składowe. Nawet jeśli wcześniej importujemy tą klasę w zwykły sposób: import java.util.arrays; import static java.util.arrays.*; Nawet jeśli tą klasę zadeklarowano w tym samym pakiecie. Nawet jeśli jest to klasa z pakietu java.lang. 3

Składowe o tej samej nazwie Kolejny sposób na przeciążanie metod. import static java.util.arrays.sort; import static java.util.collections.sort; Tak jak w przypadku zwykłych importów, konflikty pojawiają się dopiero w momencie kiedy kompilator rzeczywiście musi zdecydować: import static java.util.arrays.sort; import static w11.sortownica.sort; class Sortownica { public static void sort(float[] t) { out.println("sortownica"); public class Test { public static void main(string[] args) { //sort(new float[] {); Analogicznie w wypadku, gdy oba importy z *. Tu nie ma niejednoznaczności import static w11.sortownica.*; import static java.util.arrays.sort; 4

Przesłanianie Deklaracje lokalne przesłaniają importy statyczne (i z gwiazdką i konkretne). import static java.util.arrays.*; import static w11.sortownica.sort; public class Test { public static void sort(float[] t) { out.println("test"); public static void main(string[] args) { sort(new float[] {); sort(new int[] {); Dla przypomnienia (dla zwykłych importów jest różnica): ok import java.util.*; class Arrays { konflikt import java.util.arrays; class Arrays { 5

Przeglądanie systemu plików Klasa File służy do reprezentowania nazw plików i katalogów w sposób niezależny od systemu operacyjnego. Katalogi można przeglądać. list() zwraca tablicę napisów, a listfiles() tablicę obiektów File. Są też wersja wykonujące filtrowanie przy pomocy wzorca Strategia list(filenamefileter) i listfiles(filefileter/filenamefilter). Można też: sprawdzać rozmiar pliku, zmieniać nazwy, tworzyć/kasować pliki/katalogi, tworzyć pliki tymczasowe o generowanych nazwach, itd. 6

Przykład import java.io.*; import java.util.*; import java.util.regex.*; public class DirList { public static void zawartośćkatalogu() { File path = new File("c:\\"); String[] list; list = path.list(); Arrays.sort(list); for (String s : list) System.out.println(s); 7

Filtrowanie File path = new File("c:\\"); final String wreg = ".*?\\.sys"; String[] list = path.list(new FilenameFilter() { private Pattern pattern = Pattern.compile(wReg); public boolean accept(file dir, String name) { return pattern.matcher( //pozbywamy się ścieżki do katalogu new File(name).getName()).matches(); ); Arrays.sort(list); for(string s : list) System.out.println(s); 8

Strumienie Do obsługi danych binarnych służą: InputStream i OutputStream, a do obsługi danych Unicode Reader i Writer. Źródłem danych dla strumieniu może być: tablica bajtów, napis, plik, gniazdo, strona WWW dostępna w sieci, itd. Nadmiaru klas możemy uniknąć dzięki wzorcu Dekorator strumienie z nowymi możliwościami tworzymy z innych strumieni przy pomocy klasy opakowującej (klasy Filter...). Dodatkowa klasa RandomAccessFile pozwala na przeglądanie pliku zawierającego rekordy o znanym rozmiarze i przeskakiwanie pomiędzy nimi przy pomocy funkcji seek(). 9

Przykład //Odczytujemy plik linia po linii. try { BufferedReader in = new BufferedReader(new FileReader("c:\\kol2.txt")); String s = new String(); while ((s = in.readline())!= null) System.out.println(s); in.close(); catch (IOException e) { e.printstacktrace(); 10

Przykład BufferedReader in = new BufferedReader(new FileReader("c:\\kol2.txt")); String s, s2 = new String(); while ((s = in.readline())!= null) s2 += s + "\n"; in.close(); StringReader in2 = new StringReader(s2); int c; while((c = in2.read())!= -1) System.out.print((char)c); try { DataInputStream in3 = new DataInputStream( new ByteArrayInputStream(s2.getBytes())); //sensownie wypiszą się jedynie znaki ASCII while(true) System.out.print((char)in3.readByte()); catch(eofexception e) { System.err.println("Koniec"); 11

System.out, System.in, System.err System.out i System.err są już opakowane w PrintStream. System.in trzeba samemu opakować. BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String s; //do pierwszej pustej linii lub Ctrl-Z while ((s = in.readline())!= null && s.length()!= 0) System.out.println(s); Przy pomocy statycznych metod System.setIn(InputStream), System.setOut(PrintStream), System.setErr(PrintStream) można dokonać podmiany. 12

nio W Javie 1.4 przebudowano implementację strumieni (teraz są oparte na kanałach i buforach z pakietu java.nio). Od Javy 1.4 dzięki selektorom można tez nasłuchiwać zdarzeń z wielu kanałów naraz. Więcej na Java wybrane technologie. 13

Kompresowanie pojedynczego pliku GZIP Opracował BufferedReader in = new BufferedReader(new FileReader("c:\\kol2.txt")); //kompresja BufferedOutputStream out =new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("c:\\test.gz"))); int c; while ((c = in.read())!= -1) out.write(c); in.close(); out.close(); //dekompresja BufferedReader in2 = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream("test.gz")))); String s; while ((s = in2.readline())!= null) System.out.println(s); in2.close(); 14

Kompresja wielu plików ZIP public static void main(string[] args) throws IOException { FileOutputStream f = new FileOutputStream("c:\\test.zip"); CheckedOutputStream csum = new CheckedOutputStream(f, new CRC32()); ZipOutputStream zos = new ZipOutputStream(csum); BufferedOutputStream out = new BufferedOutputStream(zos); zos.setcomment("testowe archiwum ZIP"); for (int i = 0; i < args.length; i++) { System.out.println("Zapisywanie " + args[i]); BufferedReader in = new BufferedReader(new FileReader(args[i])); zos.putnextentry(new ZipEntry(args[i])); int c; while ((c = in.read())!= -1) out.write(c); in.close(); out.close(); System.out.println("CRC: " + csum.getchecksum().getvalue()); 15

Kompresja wielu plików ZIP... FileInputStream fi = new FileInputStream("c:\\test.zip"); CheckedInputStream csumi = new CheckedInputStream(fi, new CRC32()); ZipInputStream in2 = new ZipInputStream(csumi); BufferedInputStream bis = new BufferedInputStream(in2); ZipEntry ze; while ((ze = in2.getnextentry())!= null) { System.out.println("Odczytywanie " + ze); int x; while ((x = bis.read())!= -1) System.out.write(x); System.out.println(); System.out.println("CRC: " + csumi.getchecksum().getvalue()); bis.close(); 16

Czy takiego wyjścia się spodziewaliśmy? Opracował Ten przykład został zaczerpnięty z TIJ 3ed. Czy wynik jest zgodny z naszymi oczekiwaniami? Zapisywanie c:\a\a.txt Zapisywanie c:\a\b.txt Zapisywanie c:\a\c.txt Zapisywanie c:\a\c\d.txt CRC: 1742864089 Odczytywanie c:\a\a.txt Odczytywanie c:\a\b.txt Odczytywanie c:\a\c.txt Odczytywanie c:\a\c\d.txt» ala ma kota» i ola ma kota» nawet ula ma kota» ale ela nie ma CRC: 1742864089 17

Czego brakowało? FileOutputStream f = new FileOutputStream("c:\\test.zip"); CheckedOutputStream csum = new CheckedOutputStream(f, new CRC32()); ZipOutputStream zos = new ZipOutputStream(csum); BufferedOutputStream out = new BufferedOutputStream(zos); zos.setcomment("testowe archiwum ZIP"); for (int i = 0; i < args.length; i++) { System.out.println("Zapisywanie " + args[i]); BufferedReader in = new BufferedReader(new FileReader(args[i])); //zamyka poprzedni wpis i pozycjonuje strumień na początku następnego zos.putnextentry(new ZipEntry(args[i])); int c; while ((c = in.read())!= -1) out.write(c); out.flush();//potrzebne mimo putnextentry() in.close(); out.close(); 18

Serializacja Obiekty, które implementują interfejs Serializable można zamienić na strumień bajtów. zapisywanie/odczytywanie z plików (za wszystko odpowiada programista, zapytania wymagają wczytania wszystkich obiektów) wysyłanie przez sieć (również pomiędzy różnymi systemami operacyjnymi, kodowaniem bajtów, itp.) JavaBeans, RMI, EJB (uwaga na semantykę przekazywania parametrów) Klasy opakowujące, tablice i kolekcje implementują Serializable. Serializable nie wymusza dodawania żadnych metod. Do serializacji/deserializacji służą klasy ObjectOutputStream i ObjectInputStream, które zawierają odpowiednio metody writeobject( ) i readobject( ) Serializowany jest cały graf obiektów. 19

Przykład public class Ser implements Serializable { Random r = new Random(); public Ser dowiązanie; public String s; protected char c; private int[] tab; public Ser(char c, String s) { this.c = c; this.s = s; int i = r.nextint(10); tab = new int[i]; for (i = 0; i<tab.length; i++) tab[i] = r.nextint(9); public Ser() { System.out.println("Domyślny konstruktor"); public String tostring() { return "{c=" + c + "; s=" + s + "; " + "tab=" + tab + "; dowiązanie=" + dowiązanie + "";... 20

Przykład public static void main(string[] args) throws ClassNotFoundException, IOException { Ser s = new Ser('a', "aaa"); s.dowiązanie = new Ser('b', "bbb"); System.out.println(s); ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("c:\\ser.out")); out.writeobject("tu leży Ser\n"); out.writeobject(s); out.close(); ObjectInputStream in = new ObjectInputStream( new FileInputStream("c:\\ser.out")); String napis = (String) in.readobject(); Ser s2 = (Ser) in.readobject(); System.out.println(napis + "s2 = " + s2); System.out.println("s == s2: " + (s == s2)); 21

Wynik {c=a; s=aaa; tab=[i@130c19b; dowiązanie={c=b; s=bbb; tab=[i@1f6a7b9; dowiązanie=null Tu leży Ser s2 = {c=a; s=aaa; tab=[i@66848c; dowiązanie={c=b; s=bbb; tab=[i@8813f2; dowiązanie=null s == s2: false 22

Co w trawie piszczy Żeby deserializacja się udała odczytywana klasa musi być widoczna w CLASSPATH maszyny wirtualnej. Jak widać obiekt został utworzony bez wywołania konstruktora. Modyfikator transient zabrania serializacji danego atrybutu (przy deserializacji będzie wypełniony domyślną wartością). Dodając do naszej klasy prywatne (pewnie dlatego nie są w interfejsie) metody (które będą wykryte dzięki mechanizmowi odzwierciedleń): private void writeobject(objectoutputstream stream) throws IOException private void readobject(objectinputstream stream) throws IOException, ClassNotFoundException można ręcznie wykonać serializację składowych transient. Jeżeli chcemy skorzystać ze standardowej serializacji zwykłych składowych trzeba jako pierwszą operację w tych metodach wywołać magiczne metody: stream.defaultwriteobject( ) i stream.defaultreadobject( ). Można też w samemu obsłużyć serializację implementując interfejs Externalizable (wraz z metodami writeobject( ) i readobject( )) 23

Kopiowanie obiektów Serializacji można użyć do robienia głębokich kopii obiektów. Co jeśli serializacja obiektu X doprowadzi do serializacji obiektów A i B, które oba miały referencję do obiektu C? Czy po deserializacji powstaną dwie kopie C? Wszytko będzie dobrze i to nawet jak A i B serilizowaliśmy sami (ale do tego samego strumienia). W przypadku innych strumieni otrzymamy kopie. Uwaga na zmiany definicji zapisanej klasy (nowa wersja). 24