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
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
Klasy przedmiotowe i przetwarzające
Typy strumieni wejściowych
Interfejs dla klas dekoracyjnych FilterInputStream
Z potoku PipedInputStream
Z pliku FileInputStream
Ze String-u StringBufferInputStream
Z bufora w pamięci.
ByteArrayInputStream
Typy strumieni wyjściowych
Interfejs dla klas dekoracyjnych FilterOutputStream
Do potoku PipedOutputStream
Do pliku FileOutputStream
Uwaga! Nie ma!
String jest niezmienny
>>StringBufferOutputStream<<
Do bufora w pamięci.
ByteArrayOutputStream
Wejściowe klasy „dekoracyjne”
dekompresja InflaterInputStream
Pozwalają na
„zwracanie”
odczytanego znaku PushbackInputStream
PushbackReader
Zapewniają numerację wierszy
LineNumberInputStream LineNumberReader
Zapewniają buforowanie BufferedInputStream
BufferedReader
Pozwalają na
odczytywanie typów prostych.
DataInputStream
Wyjściowe klasy „dekoracyjne”
kompresja DeflaterOutputStream
Do wypisywania typów prostych w czytelny sposób)
PrintStream PrintWriter
Zapewniają buforowanie BufferedOutputStream
BufferedWriter
Pozwala na zapisywanie typów prostych.
writeFloat() ...
DataOutputStream
Ł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
PipedWriter PipedOutputStream
PipedReader PipedInputStream
CharArrayWriter ByteArrayOutputStream
CharArrayReader ByteArrayInputStream
StringWriter Brak odpowiednika
StringReader StringBufferInputStream
FileWriter FileOutputStream
FileReader FileInputStream
Writer OutputStream
Reader InputStream
Odpowiedniki znakowe” klas dekoracyjnych
PushBackReader PushBackInputStream
StreamTokenizer(Reader) StreamTokenizer
LineNumberReader LineNumberInputStream
PrintWriter PrintStream
DataInputStream ! DataInputStream
BufferedWriter BufferedOutputStream
BufferedReader BufferedInputStream
FilterWriter FilterOutputStream
FilterReader FilterInputStream
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