Programowanie w języku Java...

51
Programowanie w języku Java WYKŁAD dr inż. Piotr Zabawa Certyfikowany Konsultant IBM/Rational e-mail: [email protected] www: http://www.pk.edu.pl/~pzabawa 31.03.2014 Zakład Inżynierii Oprogramowania

Transcript of Programowanie w języku Java...

Page 1: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Programowanie w języku Java

WYKŁAD

dr inż. Piotr Zabawa

Certyfikowany Konsultant IBM/Rational

e-mail: [email protected]

www: http://www.pk.edu.pl/~pzabawa 31.03.2014

Zakład Inżynierii Oprogramowania

Page 2: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

WYKŁAD 6Operacje we/wy

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 3: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Biblioteki standardowe ze strumieniami:

• java.io

• java.nio

oraz zmiany wprowadzone w ramach Java 8.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 4: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Ze względu na dużą różnorodność klas w bibliotekach we/wy

intensywnie wykorzystywany jest wzorzec projektowy Dekorator.

Pozwala on na składanie obiektów tej biblioteki w ogromnej ilości

kombinacji. Zostanie to zilustrowane przykładami.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 5: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Strumień jest pojęciem abstrakcyjnym mającym następujące cechy:

• strumień związany jest ze źródłem lub odbiornikiem danych

• źródło lub odbiornik mogą być dowolne: plik, pamięć, URL, gniazdo, potok ...

• strumień służy do zapisywania-odczytywania informacji - dowolnych danych

• program: kojarzy strumień z zewnętrznym źródłem/odbiornikiem,

– otwiera strumień,

– dodaje lub pobiera dane ze strumienia,

– zamyka strumień.

• przy czytaniu lub zapisie danych z/do strumienia mogą być wykonywane

dodatkowe operacje (np. buforowanie, kodowanie-dekodowanie, kompresja-

dekompresja)

• w Javie dostarczono klas, reprezentujących strumienie. Hierarchia tych klas

pozwala na programowanie w sposób abstrahujący od konkretnych źródeł i

odbiorników.dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 6: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Wprowadzono w bibliotece we/wy różne rodzaje klas i interfejsów:

• Strumieniowe

• Dodatkowe

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 7: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Kierunki operacji strumieniowych:

• Wejściowe

• Wyjściowe

Rodzaje strumieni:

• Bajtowe (1 bajt)

• Znakowe (2 bajty, bo Unicode)

Dodatkowe zagadnienia:

• Serializacja

• Operacje na plikach

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 8: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Wejście Wyjście

Strumienie bajtowe InputStream OutputStream

Strumienie znakowe Reader Writer

Wierzchołek hierarchii klas strumieniowych przedstawiono w tabelce

poniżej.

Te abstrakcyjne klasy oferują podstawowe funkcjonalności:

• read()

• write()

• skip(), mark(), reset()

• close()

Page 9: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Strumienie:

• Bajtowe: (Stream)

– Wejściowe (InputStream, FilterInputStream,...)

– Wyjściowe (OutputStream, FilterOutputStream,...)

• Znakowe (Reader, Writer)

– Wejściowe (InputStreamReader,...)

– Wyjściowe (OutputStreamReader,...)

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 10: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy - klasy przedmiotoweStrumieniom trzeba prędzej czy później wskazać konkretne źródło lub

odbiornik. Można je sklasyfikować następująco – klasy przedmiotowe:

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Źródło/odbiornik Strumienie bajtowe Strumienie znakowe

Pamięć ByteArrayInputStream,

ByteArrayOutputStream

CharArrayReader,

CharArrayWriter

StringBufferInputStream StringReader,

StringWriter

Potok PipedInputStream,

PipedOutputStream

PipedReader,

PipedWriter

FileReader,

FileWriter

- FileInputStream,

FileOutputStream

Klasy przedmiotowe mogą dotyczyć innych zasobów – są dostępne w

innych pakietach, np. sieciowych.

Page 11: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy - klasy

przetwarzająceW czasie wykonywania operacji na strumieniach mogą być

wykonywane dodatkowe operacje wzbogacające funkcjonalność

dotychczasowych klas o dodatkowe zobowiązania.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 12: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Rodzaj przetwarzania Strumienie bajtowe Strumienie znakowe

Buforowanie BufferedInputStream,

BufferedOutputStream

BufferedReader,

BufferedWriter

Filtrowanie FilterInputStream,

FilterOutputStream

FilterReader,

FilterWriter

Konwersja: bajty-znaki InputStreamReader,

OutputStreamWriter

Konkatenacja SequenceInputStream

Serializacja obiektów ObjectInputStream,

ObjectOutputStream

Konwersje danych DataInputStream,

DataOutputStream

Zliczanie wierszy LineNumberInputStream LineNumberReader

Podglądanie PushbackInputStream PushbackReader

Drukowanie PrintStream PrintWriter

Page 13: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy – strumienie bajtowe

Strumienie bajtowe traktują dane jak zbiór ośmiobitowych bajtów.

Wszystke strumienie bajtowe dziedziczą z klas:

• InputStream (dane przychodzące do programu)

lub

• OutputStream (dane wychodzące z programu).

Strumienie zawsze należy zamykać!

Strumienie bajtowe reprezentują “niskopoziomowy” dostęp do danych.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 14: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy – strumienie bajtowe

Szczególnym rodzajem strumieni bajtowych są strumienie binarne -

koniec strumienia rozpoznaje się jako wyjątek EOFException.

Klasyfikacja strumieni binarnych:

• strumienie danych (zapis/odczyt surowych danych)

– DataInputStream

– DataOutputStream

• strumienie obiektowe (serializacja/deserializacja obiektów)

– ObjectInputStream

– ObjectOutputStream

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 15: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy – strumienie bajtowe

Strumienie bajtowe wejściowe

• InputStream – przodek hierarchii, istotne metody: int read(), int read(byte[]),

int read(byte[], int, int)

• PipedInputStream – służy do komunikacji wewnątrz programu

• ByteArrayInputStream – strumień czytający z tablicy

• FilterInputStream – przodek strumieni wprowadzających dodatkową

funkcjonalność

• DataInputStream – operujące na typach prymitywnych

• BufferedInputStream – strumień buforowany

• GZIPInputStream – strumień dekompresujący w locie dane przez niego

przechodzące

• SequenceInputStream – skleja kolejne strumienie

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 16: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy – strumienie bajtowe

Strumienie bajtowe wyjściowe

• OutputStream – przodek hierarchii, istotne metody: write(int), write(byte[]),

write(byte[],int,int)

• PipedOutputStream – służy do komunikacji wewnątrz programu

• ByteArrayOutputStream – strumień piszący do tablicy

• FilterOutputStream – przodek strumieni wprowadzających dodatkową

funkcjonalność

• DataOutputStream – operujące na typach prymitywnych

• BufferedOutputStream – strumień buforowany

• GZIPOutputStream – strumień kompresujący w locie dane przez niego

przechodzące

• FileOutputStream – strumień piszący do pliku

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 17: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy – strumienie bajtowe

Klasy buforowanych strumieni bajtowych:

• BufferedInputStream

• BufferedOutputStream

Pozwalają one na zapis/odczyt całymi liniami (buforowanie).

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 18: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy - strumienie znakowe

Strumienie znakowe automatycznie konwertują dane tekstowe do stosowanego

natywnie w Java formatu Unicode. Konwersja jest dokonywana w oparciu o

ustawienia regionalne komputera, na którym uruchomiono JVM (Wirtualną

Maszynę Javy) lub jest oprogramowana przez programistę.

Strumienie znakowe dziedziczą z klas:

• Reader (dane przychodzące do programu)

lub

• Writer (dane wychodzące z programu).

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 19: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy - strumienie znakowe

Strumienie znakowe wejściowe

• Reader – przodek hierarchii; istotne metody: write(int), write(byte[]),

write(byte[],int,int)

• BufferedReader – buforowany strumień znakowy: podstawowa metoda –

String readLine()

• LineNumberReader – strumień zliczający numery linii

• CharArrayReader – strumień piszący do tablicy znaków

• PipedReader – analogiczny do PipedOutputStream

• InputStreamReader – połączenie strumienie znakowych i bajtowych

• FileReader – strumień skierowany do pliku

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 20: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy - strumienie znakowe

Strumienie znakowe wyjściowe

• Writer – przodek hierarchii; istotne metody: write(int), write(char[]),

write(String)

• BufferedWriter – buforowany strumień znakowy

• CharArrayWriter – strumień piszący do tablicy znaków

• PipedWriter – analogiczny do PipedOutputStream

• OutputStreamWriter – połączenie strumienie znakowych i bajtowych

• FileWriter – strumień skierowany do pliku

• PrintWriter – podobny do PrintOutputStream, ale nie dysponuje metodami do

obsługi byte[]

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 21: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy - strumienie znakowe

Klasy buforowanych strumieni znakowych:

• BufferedReader

• BufferedWriter

Pozwalają one na zapis/odczyt całymi liniami (buforowanie).

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 22: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy - strumienie znakowe

Przykłady:

• Stdin

String s;

BufferedReader br = new BufferedReader(

new InputStreamReader(System.in));

while ( (s = br.readLine()) != null ) {

System.out.println(s);

}

Strumienie znakowe buforowane umożliwiają odczytywanie tekstu

wierszami.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 23: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy - strumienie znakowe

• Stdout

String fname = "c:\\data\\output.txt";

Writer writer = new OutputStreamWriter(new

FileOutputStream(fname));

writer.write("Hello World");

writer.close();

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 24: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy - strumienie znakowe

Przykład dekorowania:

String s;

BufferedReader br = new BufferedReader(

new InputStreamReader(

new GZIPInputStream(

new FileInputStream(

new File(“data.txt.gz”)))));

while ( (s = br.readLine()) != null ) {

System.out.println(s);

}

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 25: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Strumienie działające na plikach:

• FileInputStream

• FileOutputStream

• FileReader

• FileWriter

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 26: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Znaczenie klasy File – operacje na plikach i na katalogach.

Problem rekurencyjnego nawigowania po systemie plików.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 27: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Pliki o dostępie swobodnym:

RandomAccessFile

Nie są one strumieniami i nie należą do omawianej hierarchii.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 28: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Zastosowania serializacji:

• komunikacja pomiędzy obiektami/aplikacjami poprzez gniazdka

(sockets),

• zachowanie obiektu (jego stanu i właściwości) do późniejszego

odtworzenia i wykorzystania przez tę samą lub inną aplikację.

Ma zastosowanie w aplikacjach korporacyjnych.

W czasie serializacji zapisywany jest rekurencyjnie stan obiektów

składowych, jednak pod warunkiem, że implementują one interfejs

Serializable.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 29: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Serializacja związana jest ze strumieniami obiektowymi.

Klasa serializowana musi implementować interfejs Serializable. Jeśli

w trakcie serializacji/deserializacji trzeba wykonać nietypowe operacje, to

należy zaimplementować metody:

private void writeObject(java.io.ObjectOutputStream out)

throws IOException;

private void readObject(java.io.ObjectInputStream in)

throws IOException, ClassNotFoundException;

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 30: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

• przy serializacji nie są zapisywane pola statyczne oraz pola

deklarowane ze specyfikatorem transient; specyfikatora transient

używamy więc wobec elementów informacji o obiekcie, których nie

chcemy poddawać utrwaleniu.

• pełniejszą kontrolę nad sposobem serializacji możemy zyskać

definiując odpowiednie metody w klasie obiektu serializowanegoo,

metody te winny mieć następujące sygnatury:

• całkowitą kontrolę nad formatem i sposobem serializacji zyskujemy

poprzez implementację w klasie interfejsu Externalizable i

dostarczenie metod writeExternal i readExternal

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 31: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Serializacja i deserializacja

// serializacja

class X implements Serializable {

int i;

}

ObjectOutputStream s = new ObjectOutputStream( new

FileOutputStream("data.dat"));

s.writeObject("Today");

s.writeObject(new Date());

s.writeObject(new X());

s.flush();

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 32: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

// deserializacja

ObjectInputStream s = new ObjectInputStream( new

FileInputStream("data.dat"));

String today = (String)s.readObject();

Date date = (Date)s.readObject();

X x = (X) s.readObject();

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 33: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Dla obiektów typu JavaBeans istnieje także możliwość serializacji tekstowej

(do plików w formacie XML) z wykorzystaniem klas XMLEncoder i

XMLDecoder.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 34: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Potoki.

Służą one do przesyłania danych pomiędzy równolegle działającymi

wątkami.

O wielowątkowości w Java będziemy mówili na jednym z dalszych

wykładów.

Na następnych dwóch slajdach – przykład komunikacji między dwoma

obiektami-wątkami.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 35: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

class DataPutter extends Thread {

OutputStream out;

public DataPutter(OutputStream o) {

out = o;

}

public void run() {

try {

for (char c = 'a'; c <= 'z'; c++)

out.write(c);

out.close();

}

catch(IOException exc) {

return;

}

}

}

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 36: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

class DataGetter extends Thread {

InputStream in;

public DataGetter(InputStream i) {

in = i;

}

public void run() {

try {

int c;

while ((c = in.read()) != -1) System.out.println((char) c);

}

catch(IOException exc) {

return;

}

}

}

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 37: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Dodatkowe usługi związane ze strumieniami w pakiecie:

• java.util

Obejmują one:

• java.util.Scanner

• java.util.Formatter

• java.util.Locale

• java.util.ResourceBundle

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 38: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Nowa biblioteka (od Java 1.7) we/wy:

• java.nio

Wprowadzono w niej nieblokujące operacje we/wy. Operacje

oferowane przez tę bibliotekę są znacznie szybsze niż przez java.io.

Zawiera ona następujące elementy:

• Buffers – kontenery danych (także: mapowane do pamięci)

• Channels – mechanizmy operowania na danych

• Selectors – mechanizmy wybierania kanałów dostępnych (gotowych

do operacji we/wy)

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 39: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Działania na plikach:

• Pakiet java.nio.file

• Interfejs Path – reprezentuje pliki i katalogi

• Klasa Files – operacje na plikach

Obsługuje:

• Strumienie bajtowe

• Kanały

• Swobodny dostęp do plików za pomocą kanałów i interfejsu

SeekableByteChannel

• Mapowanie kanałów na pamięć – błyskawiczne operacje na plikach

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 40: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Archiwa JAR – możliwość kompresji, umieszczania w nich klas,

cyfrowego podpisywania,…:

• JarOutputStream

• JarInputStream

Sposób tworzenia archiwum z linii komend:

jar cf archiwum.jar klasa1.class klasa2.class ...

c – tworzenie pliku (create),

f – zawartość archiwum zostanie zapisana do pliku archiwum.jar

m – do archiwum zostanie dołączony plik manifest z określonej

lokalizacji, np: jar cmf plik_manifest archiwum.jar *,

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 41: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

W archiwum jar znajduje się katalog META-INF a w nim plik

MANIFEST.MF zawierający dodatkowe informacje o archiwum.

Przykładowa zawartość:

Manifest-Version: 1.0

Created-By: 1.5.0-b64 (Sun Microsystems Inc.)

Ant-Version: Apache Ant 1.6.5

Main-Class: pl.edu.pk.jp.RunnerClass

mówi, że po uruchomieniu archiwum wykonana zostanie metoda

main(String[] args) zawarta w klasie RunnerClass znajdującej się w

pakiecie pl.edu.pk.jp.

Uruchomienie pliku jar:

java -jar archiwum.jar

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 42: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Java 8

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 43: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Java 8 – Stream API

Ze względu na wzrost znaczenia możliwości sprzętowych

oferowanych przez współczesne mikroprocesory postanowiono położyć

nacisk na równoległość przetwarzania:

• Pracowano nad opartym na Javie systemie operacyjnym czasu

rzeczywistego

• Wprowadzano w Java implementację wielowątkowości – Fork Join

Framework (FJF)

• Implementowano biblioteki standardowe Java opierając je o FJF

Przykładem takiej biblioteki jest właśnie Java 8 Stream API.

Skoncentrowano się w niej na przetwarzaniu danych w sposób abstrakcyjny

zwalniając tym samym programistę od konieczności oprogramowania

niskopoziomowej logiki wielowątkowej.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 44: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Java 8 – Stream API

Kolekcje a strumienie:

• Kolekcje – predefiniowane struktury danych w pamięci zawierające

elementy wyliczane przed umieszczeniem ich w kolekcji

• Strumienie – ustalone struktury danych wyliczające elementy na

żądanie

Strumienie w Java 8 można postrzegać jako leniwie konstruowane

kolekcje , w których wartości elementów wyznaczane są na żądanie

użytkownika. Odwrotnie niż w Java 8-.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 45: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Java 8 – Stream API

Strumienie w Java 8 zostały zdefiniowane w pakiecie:

• java.util.stream

Kolekcje Java 8 mają dodane metody zwracające Stream. Z punktu

widzenia strumieni źródłem danych dla nich mogą być:

• Kolekcje

• Operacje we/wy

• Tablice

Podobnie jak w przypadku funkcyjnych języków programowania

Strumienie wspierają operacje agregowania – przykłady:

• filter, map, reduce, find, match, sort

Operacje te mogą być wykonywane sekwencyjnie lub równolegle.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 46: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Java 8 – Stream API

Dodatkowo strumienie w Java 8 wspierają:

• Pipelining (operacje na strumieniach zwracają strumienie – możliwość

składania operacji)

• Iteracje wewnętrzne

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 47: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Java 8 – Stream API

Przykład – wyszukanie spośród studentów takich dziesięciu, których

nazwiska zaczynają się od „A‟:

List<String> names = students.stream()

.map(Student::getName)

.filter(name->name.startsWith("A"))

.limit(10)

.collect(Collectors.toList());

Operacje:

• Pośrednie (intermediate) – powyżej map, filter, limit

• Końcowe (terminal)

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 48: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Java 8 – Stream API

W Java 8 wprowadzono możliwość wykorzystania wyrażeń lambda.

Przykład – stare API.

List<Block> blocks = /* ... */;

int sumOfWeights = 0;

for (Block block : blocks) {

if (block.getColor() == Color.RED) {

sumOfWeights += block.getWeight();

}

}

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 49: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Java 8 – Stream API

Przykład – nowe API.

List<Block> blocks = /* ... */;

int sumOfWeights = blocks.stream()

.filter(b -> b.getColor() == Color.RED)

.map(b -> b.getWeight())

.sum();

Można spotkać się ze słowami krytyki dotyczącymi braku

bezstanowych wyrażeń lambda w Java 8 negatywnie rzutującymi na

możliwą do uzyskania efektywność operacji strumieniowych.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 50: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Operacje we/wy

Używanie standardowej biblioteki we/wy w każdej z postaci wymaga

przechwytywania i obsługi wyjątków po stronie klienta. Dlatego na

kolejnym wykładzie poznamy wyjątki.

W czasie wykorzystywania operacji we/wy na zajęciach polegaliśmy

na mechanizmie generowania obsługi wyjątków oferowanym przez

środowisko deweloperskie.

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania

Page 51: Programowanie w języku Java WYKŁADriad.pk.edu.pl/~pzabawa/files/JP/ProgramowanieJava_W06.pdfStrumienie znakowe automatycznie konwertują dane tekstowe do stosowanego natywnie w Java

Koniec

dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki

Zakład Inżynierii Oprogramowania