Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałIrena Szulczyński Został zmieniony 10 lat temu
1
Czytanie, pisanie i rysowanie (czyli klasa I szkoły podstawowej)
2
Java IO, czyli strumienie, readery, writery i bajery
Ideologia: Na początku jest strumień (InputStream lub OutputStream) Pochodzący z pliku (File...Stream) lub z tablicy bajtów (ByteArray...Stream) i jeszcze z paru innych źródeł Przyozdabiany (Buffered...Stream, Data...Stream, GZIP...Stream) Ale zawsze jest to strumień BAJTÓW Do IO binarnego!
3
Nauka czytania i pisania binarnego, czyli strumienie
InputStream ma tylko: byte read() read(byte[] in <, int off, int len>) skip(int n) close() I można go spytać, czy ma mark() i reset() (markSupported()) DataInputStream ma ponadto: readBoolean(),...,readDouble() A np. ObjectInputStream potrafi czytać obiekty (zserializowane)
4
Strumienie – cd. Łatwo się domyśleć, co potrafi np. DataOutputStream
write (byte b, int off, int len), writeInt(int n),..., flush(), size() etc. Uwaga: java czyta i pisze binarnie Big endian!!! (od najstarszego bajtu) Intel (czyli pecety) czytają i piszą Little endian!!! Konwersja: via byte buffer[] i ByteArray...Stream lub "manualna" W necie są gotowe klasy/pakiety
5
Słów parę o abstrakcji Klasa abstrakcyjna czyli Poszukiwane Ogniwo Pośrednie między klasą i interfejsem – prefiksowane abstract deklaracje metod (bez implementacji). Po co to? Planowo: zbiorczy interfejs dla grupy podobnych klas zawierający implementację wspólnych metod "Tak wyszło": mamy kilka różnych klas z niepustą częścią wspólną, którą wyrzucamy do klasy abstrakcyjnej i dziedziczymy po niej – oszczędzamy na objętości kodu i jego modyfikacjach
6
Słów parę o abstrakcji Przykład dziedziczenia
abstract public class DataReader{ protected static String name = "New Reader"; protected static String shortName = "New"; protected DataReader() { jakieś inicjalizacje... } public final String getName() {return name;} abstract public boolean readMol(Molecule mol); } public class XXXReader extends DataReader{ protected static String name = "XXX Reader"; protected static String shortName = "XXX"; public XXXReader() {super(); inicjalizacja specyficzna ...} public boolean readMol(Molecule mol){ ...} }
7
Słów parę o abstrakcji – deklaracja i tworzenie obiektu
... Molecule mol = new Molecule(); DataReader reader; switch (readerType) { case TYPE_XXX: reader = new XXXReader(); break; } reader.readMol(mol); Jak widać, wybór konkretnej implementacji DataReadera może być dokonany dopiero w trakcie wykonywania programu.
8
Nauka czytania i pisania znakowego czyli readery i writery
Java wierzy w UNICODE Dlatego char to są 2 bajty! String to łańcuch znaków, więc do czytania i pisania znakowego musimy używać klas Reader/Writer o odpowiednim smaku
9
Co potrafi reader/writer
BufferedReader: readLine(); BufferedWriter: print(String), println(String); printf(String,...) (formatowanie podobne do C : printf("%3d %6f.2 %n",i,x);
10
Sztuka pakowania (aka. Dekorowania)
Jeżeli chcemy czytać lub pisać znakowo używając binariów musimy użyć Readera/Writera zrobionego ze strumienia przez odpowiednią dekorację: BufferedReader r = new BufferedReader( new InputStreamReader( new FileInputStream(fName))); BufferedWriter w = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(fName))); Dekoracja – wzorzec polegający na zamknięciu klasy prostszej w bardziej skomplikowanej i "eksport" metod klasy dekorowanej z "opakowującym" konstruktorem
11
Sztuka pakowania – cd. Z pakowania możemy skorzystać implementując wielokrotne dziedziczenie: public class A{ public void aqq(...) {...} } public class B{ public void bqq(...) public void setI(int t){ this.t = t; ... interface IntA{ public void aqq(...); interface IntB{ public void bqq(...); public void setI(int t); public class AB extends A implements IntB{ B b = new b(); ... (np. konstruktory z parametrami dla A i B) public void bqq(...){ b.bqq(); public void setT(int t){ b.setT(t); } lub public class BA extends B implements IntA ... lub public class C implements IntA,IntB
12
A teraz czytanie ze zrozumieniem
Reader pozwala na przeczytanie wiersza String line = reader.readLine(); Musimy teraz przeczytać line: String[] tokens = line.split(" +|, *|; *"); (np.: line="1 2, ; aaa" da tokens={"1","2","3.45","aaa"}) i rozszyfrować każdy token z osobna: int i = Integer.parseInt(token[0]); int j = Integer.parseInt(token[1]); float t = Float.parseFloat(token[2]); String txt = new String(token[3]);
13
Łapanie pcheł i wyjątków
Próba skompilowania kodu zawierającego takie czytanie/pisanie da błędy!!! Metody klas ...Stream, ...Reader, ...Writer oraz parse... mogą zgłosić wyjątek, który trzeba przechwycić lub wyrzucić wyżej
14
Spróbuj i złap lub odrzuć dalej
try{ instrukcje "podejrzane" } catch ...Exception e{ obsługa e (typowo: e.printStackTrace();) lub public void readSomething(...) throws ...Exception e{ ... i niech inni się martwią, co z tym zrobić
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.