W większości języków programowania biblioteki wejścia/wyjścia ukrywają szczegóły obsługi poszczególnych mediów pod abstrakcją strumienia (ang. stream).

Slides:



Advertisements
Podobne prezentacje
Wstęp do strumieni danych
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Mgr inż.Marcin Borkowski Podstawy Java Część II
Mgr inż.Marcin Borkowski Podstawy Java Krótkie wprowadzenie dla studentów Wyższej Szkoły Ekologii i Zarządzania
Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 6 Wojciech Pieprzyca.
Wzorce.
Nguyen Hung Son Uniwersytet Warszawski
Programowanie obiektowe w Javie
RMI I RMI-IIOP Wprowadzenie Co to jest RMI?
W ZORCE P ROJEKTOWE … czyli ktoś już rozwiązał Twoje problemy!
Inżynieria oprogramowania Lecture XXX JavaTM – część IV: IO
C++ wykład 2 ( ) Klasy i obiekty.
Gniazda komunikacji sieciowej w języku Java
Programowanie w C Wykład 3
Język ANSI C Operacje we/wy
Czytanie, pisanie i rysowanie – cd.. Jeszcze jeden strumyk PrintStream działa jak PrintWriter, ale: Używa domyślnego (systemowego) kodowania Nie wyrzuca.
Czytanie, pisanie i rysowanie (czyli klasa I szkoły podstawowej)

Tablice tablica jest sekwencją elementów tego samego typu (prostego lub obiektowego) w Javie tablice są obiektami, a zmienne tablicowe przechowują referencję
Obsługa systemu wejścia-wyjścia
Język Java Wielowątkowość.
Serializacja Serializacja pozwala zamienić obiekt na sekwencję bajtów, w sposób umożliwiający później wierne odtworzenie jego zawartości Inna nazwa to.
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
Podstawy programowania II
Obsługa systemu wejścia-wyjścia
Programowanie obiektowe – zastosowanie języka Java SE
JAVA.
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
WPROWADZENIE W ŚWIAT OBIEKTÓW
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Maciek Mięczakowski
Inicjalizacja i sprzątanie
Seminarium problemowe
Systemy wejścia i wyjścia Michał Wrona. Co to jest system wejścia i wyjścia? Pobierania informacji ze źródeł danych, zdolnych przesyłać sekwencje bajtów,
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Programowanie obiektowe 2013/2014
1 Strumienie Hierarchie klas strumieniowych, strumienie bajtowe - klasy InputStream i OutputStream i ich metody, klasa File, strumienie plikowe, strumienie.
Programowanie sieciowe w Javie
Kurs języka C++ – wykład 9 ( )
Programowanie w języku C++
Programowanie strukturalne i obiektowe C++
Kurs języka C++ – wykład 4 ( )
Programowanie obiektowe Wykład 9 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/15 Dariusz Wardowski.
PROGRAMOWANIE W JAVA Informatyka Stosowana – ROK II / III Laboratoria mgr inż. Krzysztof Bzowski.
Waldemar Bartyna 1 Programowanie zaawansowane LINQ to XML.
Programowanie Zaawansowane
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Strumienie w języku Java Bartosz Walter InMoST Wielkopolska sieć współpracy w zakresie innowacyjnych metod wytwarzania oprogramowania Termin realizacji:
Podstawowe konstrukcje języka Java Bartosz Walter InMoST Wielkopolska sieć współpracy w zakresie innowacyjnych metod wytwarzania oprogramowania Termin.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Programowanie Obiektowe – Wykład 6
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
Klasy wewnętrzne. Praktyka użycia interfejsów i klas wewnętrznych
Programowanie obiektowe – zastosowanie języka Java SE
Aplikacje i usługi internetowe
PGO Interfejsy Michail Mokkas.
Założenia projektowe Javy
PGO - Projektowanie i implementacja pierwszych klas
PGO Dziedziczenie Michail Mokkas.
Programowanie w Javie 1 Dr Robert Kowalczyk
Zapis prezentacji:

W większości języków programowania biblioteki wejścia/wyjścia ukrywają szczegóły obsługi poszczególnych mediów pod abstrakcją strumienia (ang. stream). Strumienie są używane zarówno do wysyłania/zapisywania jak i pobierania/odczytywania porcji danych. Główną zaletą takiego podejścia jest jego uniwersalność.

1. InputStream i Reader reprezentują strumienie danych wejściowych, a OutputStream i Writer strumienie danych wyjściowych 2. Para InputStream i OutputStream jest przeznaczona do obsługi danych binarnych. 3. Reader i Writer dodano do języka w wersji 1.1 i służą do obsługi danych znakowych. 1.InputStream, 2.OutputStream 1.Reader 2.Writer.

pliku, tablicy bajtów/znaków, obiekcie String oraz łączu (ang. pipe) służącym do komunikacji procesów.

Podklasy InputStream i OutputStream Podklasy Reader i Writer Opis FileInputStream i FileOutputStream FileReader i FileWriter Pozwalają odczytywać i zapisywać pliki dyskowe. Jako parametr konstruktora przekaż nazwę pliku dyskowego lub wskazujący go obiekt File. Tworząc obiekt wyjściowy, jako drugi argument konstruktora, możesz przekazać wartość logicznią określającą czy zamiast zamazywać istniejący plik dopisywać kolejne dane na jego końcu. ByteArrayInputStream i ByteArrayOutputStream CharArrayReader i CharArrayWriter Bufor w pamięci oparty na tablicy odpowiednio bajtów lub znaków. Tworząc obiekt wejściowy, przekaż konstruktorowi tablicę, na której ma być oparty. Tworząc obiekt wyjściowy, przekaż konstruktorowi początkowy rozmiar bufora.

Podklasy InputStream i OutputStream Podklasy Reader i Writer Opis StringBufferInputStream (nie ma odpowiednika do zapisu) StringReader i StringWriter Bufor w pamięci oparty na napisie String (implementacja posługuje się obiektem StringBuffer). Tworząc obiekt wejściowy, przekaż konstruktorowi napis, na którym ma być oparty. Tworząc obiekt wyjściowy przekaż konstruktorowi początkowy rozmiar bufora. Zaleca się używanie klas z hierarchii Reader/Writer. StringBufferInputStream jest oznaczony jako deprecated. PipedInputStream i PipedOutputStream PipedReader i PipedWriter Łącze do komunikacji między procesami. Przy pomocy konstruktora bezparametrowego należy najpierw utworzyć obiekt jednego rodzaju (wejściowy lub wyjściowy), a następnie przekazać go jako parametr konstruktora obiektu drugiego rodzaju (odpowiednio wyjściowego lub wejściowego). Strumienie zostaną połączone łączem, które będzie przesyłać dane od strumienia wyjściowego do wejściowego.

Strumień binarny można przekształcić na strumień znakowy. Służą do tego klasy InputStreamReader i OutputStreamWriter. Taka konwersja czasami jest bardzo przydatna, np. podczas kompresji i dekompresji danych.

Wzorzec dekoratora polega na opakowaniu oryginalnej klasy w nową klasę "dekorującą". Zwykle przekazuje się oryginalny obiekt jako parametr konstruktora dekoratora, metody dekoratora wywołują metody oryginalnego obiektu i dodatkowo implementują nową funkcjonalność.

Strumienie można wykorzystać jedynie w podstawowy sposób – odczytując lub zapisując poszczególne bajty lub znaki. Jeśli chcemy dodać nową funkcjonalność do strumieni, np. możliwość buforowania lub kompresji musimy nasz podstawowy egzemplarz strumienia przekazać do obiektu zwanego dekoratorem. Dekorator implementuje ten sam interfejs lub rozszerza tę samą klasę bazową, którą rozszerza dekorowany obiekt. Dzięki temu można go używać zamiast obiektu oryginalnego. Poszczególne metody dekoratora wywołują metody oryginalnego obiektu, a w między czasie dodają nową funkcjonalność.

Podklasy InputStream i OutputStream Podklasy Reader i Writer Opis BufferedInputStream i BufferedOutputStream BufferedReader i BufferedWriter Operacje na strumieniu stają się buforowane. W większości przypadków skutkuje to znaczącym wzrostem efektywności. Zamiast wykonywać wiele drobnych operacji na strumieniu, np. wiele razy odczytywać/zapisywać z pliku dyskowego małe porcje danych. Dekorator odczytuje większą porcję na zapas lub zapamiętuje dane, które mają być wysłane do strumienia dopóki nie uzbiera się ich dostateczna ilość. PrintStreamPrintWriter Dodają wiele nowych metod pozwalających zapisywać do strumienia dane w sposób czytelny dla człowieka.

W Javie do standardowego wyjścia/wejścia mamy dostęp poprzez zmienne statyczne klasy System System.out i System.err (typu PrintStream) System.in (typu InputStream)

1. setIn(InputStream) 2. setOut(PrintStream) 3. setErr(PrintStream) Do przekierowywania używamy statycznych metod z klasy System

W Javie 1.4 dodano "nowe" biblioteki wejścia/wyjścia (ang. new I/O). Są one zebrane w pakietach java.nio.* Głównym celem przy opracowywaniu nowych bibliotek był wzrost prędkości działania Jeżeli nie zależy nam na osiągnięciu maksymalnej możliwej prędkości działania wejścia/wyjścia, dotychczasowe "stare" biblioteki są nadal zalecana.

Serializacja - przekształcanie obiektów na postać binarną lub znakową (np. XML) w sposób, który umożliwia ich późniejsze odtworzenie Deserializacja – proces odwrotny Zastosowania: Zachowywanie stanu obiektu w pliku Przesyłanie obiektu strumieniami, np. przez sieć

Interfejs Serializable – wymagana jest jego implementacja, ObjectOutputStream, ObjectInputStream - klasy umożliwiające zapis i odczyt serializowanych obiektów, Zapis – metoda writeObject (Object o) Odczyt – metoda readObject (), nie wywołuje konstruktora obiektu, Wielokrotne referencje do obiektu – tylko jeden egzemplarz zapisany

class A implements Serializable { public A(int n) { num = n; System.out.println("Konstruuję obiekt klasy A"); } public String toString() { return "" + num; } int num; public static void main(String[] args) { A a = new A(42); System.out.println(a); ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("plik.o")); out.writeObject(a); out.close(); ObjectInputStream in = new ObjectInputStream(new FileInputStream("plik.o")); A a1 = (A) in.readObject(); in.close(); System.out.println(a1); }} Wynik działania: Konstruuję obiekt klasy A 42

Składowe transient – atrybuty wyłączone z domyślnego systemu serializacji, Metody writeObject() i readObject() – umożliwiają zastąpienie domyślnych metod serializacji własnym kodem

class A implements Serializable { int num; transient String str; public A(int n, String s) {num = n; str = s;} public String toString {return num + + str;} } public static void main(String[] args) { A a1 = new A (42, napis), a2; System.out.println(a1); // zapis i odczyt w taki sam sposób out.writeObject(a1); a2 = (A) in.readObject(); System.out.println(a2); } Wynik działania: 42 napis 42 null

class A implements Serializable { int num; transient String str; public A(int n, String s) {num = n; str = s;} public String toString {return num + + str;} private void writeObject(ObjectOutputStream oos) throws IOException { oos.defaultWriteObject(); oos.writeObject(str); } private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { ois.defaultReadObject(); str = (String) ois.readObject(); } Wynik działania: 42 napis

Rozszerzenie interfejsu Serializable, Metody: readExternal(), writeExternal(), interfejs deklaruje je jako publiczne Brak możliwości korzystania z domyślnego systemu serializacji (można jednak przesłać obiekt do metody writeObject() ) W trakcie deserializacji wywołanie domyślnego konstruktora

Problem: wczytanie z pliku obiektu nowszej lub starszej wersji klasy Domyślne zachowanie Javy: zgłoszenie wyjątku InvalidClassException Rozwiązanie: atrybut static final long serialVersionUID Atrybuty usunięte z klasy, a zawarte w pliku są ignorowane; nowe atrybuty mają wartości domyślne dla swojego typu

XMLEncoder, XMLDecoder – klasy z pakietu java.beans, umożliwiające zapis do XML Serializowane obiekty powinny być zgodne ze specyfikacją JavaBeans: Publiczna klasa, Publiczny, bezparametrowy konstruktor, Metody get i set dla każdego atrybutu Implementacja interfejsu Serializable nie jest wymagana

public class A { int num; String str; public A(){} public A(int n, String s) {num = n; str = s;} public int getNum() {return num;} public void setNum(int n) {num = n;} public String getStr() {return str;} public void setStr(String s) {str = s;} public String toString() {return num + " " + str;} public static void main(String[] args) throws FileNotFoundException{ A a = new A(42, "napis"), a1; System.out.println(a); XMLEncoder out = new XMLEncoder(new FileOutputStream("plik.xml")); out.writeObject(a); out.close(); XMLDecoder in = new XMLDecoder(new FileInputStream("plik.xml")); a1 = (A) in.readObject(); in.close(); System.out.println(a1);}} Wynik działania: 42 napis

Wynikowy plik XML: 42 napis