Biblioteki wejścia/wyjścia Strumienie we/wy (I/O)
Pojęcie strumienia Strumień reprezentuje źródło lub odbiorcę danych (obiekt zdolny odbierać lub produkować dane). Strumień ukrywa szczegóły związane z rzeczywistymi operacjami wykonywanymi na danych w urządzeniach we/wy. Hierarchię klas biblioteki we/wy moŝna podzielić ze względu na kierunek przepływu danych (wejście i wyjście) oraz na elementarne jednostki danych
Strumienie: bajtowe InputStream OutputStream znakowe Reader Writer Strumienie bajtów stosuje się do danych binarnych (obraz, dźwięk), strumienie znakowe do sformatowanych danych liczbowych i oczywiście tekstu. Preferować znakowe (Unicode, efektywniejsze)
Unicode (UCS) Reprezentacja 2-bajtowa MoŜliwość prezentacji, wymiany i przetwarzania tekstów w róŝnych językach Około 50 000 znaków www.unicode.org 127 pierwszych znaków jest zgodnych z ASCII 256 pierwszych ISO 8859-1
UTF-8 Pewne sekwencje bajtów posiadają specjalne znaczenie w róŝnych systemach operacyjnych. Unicode moŝe być niebezpieczny! UTF (UCS Transformation Format) UTF-8 : 1 bajt dla ASCII,2 bajty dla znaków 8-bitowych i 3 bajty dla pozostałych
Klasy przedmiotowe i przetwarzające Hierarchia klas strumieniowych obejmuje tzw. klasy przedmiotowe to jest związane z konkretnym źródłem lub odbiorcą danych (tablica, łańcuch znaków, plik,) potok...)* oraz klasy przetwarzające (dekoracyjne), których zadanie polega na dostarczeniu dodatkowych uŝytecznych własności (nazywane teŝ filtrami). Przykładem klasy dekoracyjnej jest DataInputStream umoŝliwiająca odczyt ze strumienia danych wszystkich podstawowych typów (readbyte(), readfloat()...) i stringów. Odwrotne usługi oferuje DataOutputStream. * Nazywane równieŝ strumieniami ujścia danych
Typy strumieni wejściowych ByteArrayInputStream Z bufora w pamięci. StringBufferInputStream Ze String-u FileInputStream Z pliku PipedInputStream Z potoku FilterInputStream Interfejs dla klas dekoracyjnych
Typy strumieni wyjściowych ByteArrayOutputStream Do bufora w pamięci. >>StringBufferOutputStream<< Uwaga! Nie ma! String jest niezmienny FileOutputStream Do pliku PipedOutputStream Do potoku FilterOutputStream Interfejs dla klas dekoracyjnych
Wejściowe klasy dekoracyjne DataInputStream BufferedInputStream BufferedReader LineNumberInputStream LineNumberReader PushbackInputStream PushbackReader InflaterInputStream Pozwalają na odczytywanie typów prostych. Zapewniają buforowanie Zapewniają numerację wierszy Pozwalają na zwracanie odczytanego znaku dekompresja
Wyjściowe klasy dekoracyjne DataOutputStream BufferedOutputStream BufferedWriter PrintStream PrintWriter DeflaterOutputStream Pozwala na zapisywanie typów prostych. writefloat()... Zapewniają buforowanie Do wypisywania typów prostych w czytelny sposób) kompresja
Łańcuchy strumieni Strumienie zwiększają swoje moŝliwości gdy wyjście jednego strumienia połączymy do wejścia innego tworząc łańcuch.
Przykład File f = new File ( phrases.utf ) ; FileReader r = new FileReader(f); BufferedReader in = new BufferedReader(r); String line = in.readline() ; //unexpected result! // System.getProperty( file.encoding ) ;
Readers & Writers Z uwagi na operowanie kodami Unicode (internacjonalizacja) biblioteki we/wy w języku Java uległy w wersji 1.1 gruntownej modyfikacji (rozbudowie) Są sytuacje gdy w programie uŝywa się zarówno klas bajtowych jak i znakowych wówczas poŝyteczne mogą być klasy konwerujące: InputStream InputStreamReader Reader OutputStream OutputStreamWriter Writer
Przykład again File f = new File ( phrases.utf ) ; FileInputStream is = new FileInputStream(f); InputStreamReader in = new InputStreamReader (is, UTF8 ); BufferedReader in = new BufferedReader(in); String line = in.readline() ; // is ok
Odpowiedniki znakowe klas przedmiotowych InputStream OutputStream FileInputStream FileOutputStream StringBufferInputStream Brak odpowiednika ByteArrayInputStream ByteArrayOutputStream PipedInputStream PipedOutputStream Reader Writer FileReader FileWriter StringReader StringWriter CharArrayReader CharArrayWriter PipedReader PipedWriter
Odpowiedniki znakowe klas dekoracyjnych FilterInputStream FilterOutputStream BufferedInputStream BufferedOutputStream DataInputStream PrintStream LineNumberInputStream StreamTokenizer PushBackInputStream FilterReader FilterWriter BufferedReader BufferedWriter DataInputStream! PrintWriter LineNumberReader StreamTokenizer(Reader) PushBackReader
RandomAccessFile Pliki zbudowane z rekordów o znanej długości, do których uzyskuje się dostęp przez zmianę połoŝenia wskaźnika (seek()) obsługiwane są przez klasę RandomAccessFile