System obsªugi wej±cia i wyj±cia. Robert A. Kªopotek r.klopotek@uksw.edu.pl Wydziaª Matematyczno-Przyrodniczy. Szkoªa Nauk cisªych, UKSW 6.04.2017
Java I/O Java I/O (Input and Output) - jest to zaawansowany system obsªugi wej±cia i wyj±cia Java u»ywa koncepcji strumieni, strumieniami mog by pliki, dane przesyªane przez internet i inne biblioteka java.io zawiera wszystkie klasy potrzebne do operacji na wej±ciu i wyj±ciu aplikacji do komunikacji przez sie sªu»y Java Networking API (b dzie omawiana pó¹niej) istnieje alternatywne IO API - Java NIO (Non-blocking IO - dost p bez blokowania) 3 strumienie s tworzone automatycznie: 2 / 36 System.out - standardowy strumie«wyj±cia System.in - standardowy strumie«wej±cia System.err - standardowy strumie«bª dów
Klasa java.io.file reprezentuje pliki lub katalogi zawiera wiele wªasno±ci zale»nych od systemu operacyjnego JDK 1.7 zwiera bardziej wszechstronn i pozbawian wielu ogranicze«klas java.nio.file.path biblioteka java.io zawiera wszystkie klasy potrzebne do operacji na wej±ciu i wyj±ciu aplikacji konstruktory: public File(String pathstring) public File(String parent, String child) public File(File parent, String child) public File(URI uri) 3 / 36
Metody werykacji plików lub katalogów public boolean exists() public long length() public boolean isdirectory() public boolean isfile() public boolean canread() public boolean canwrite() public boolean delete() public void deleteonexit() public boolean renameto(file dest) public boolean mkdir() 4 / 36
Wyj tki wej±cia/wyj±cia 5 / 36
Strumienie znaków i bajtów 6 / 36
Metody OutputStream OutputStream jest klas abstrakcyjn i jest klas bazow dla wszystkich klas reprezentuj cych wyj±ciowy strumie«bajtów public void write(int)throws IOException public void write(byte[])throws IOException public void ush()throws IOException public void close()throws IOException 7 / 36
Hierarchia OutputStream 8 / 36
Metody InputStream InputStream jest klas abstrakcyjn i jest klas bazow dla wszystkich klas reprezentuj cych wej±ciowy strumie«bajtów public abstract int read()throws IOException public int available()throws IOException public void close()throws IOException 9 / 36
Hierarchia InputStream 10 / 36
Klasy strumieni Type Input (Byte) Output (Byte) Input (Character) Output (Character) Arrays ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter Pipes PipedInputStream PipedOutputStream PipedReader PipedWriter Buering BueredInputStream BueredOutputStream BueredReader BueredWriter Filtering FilterInputStream FilterOutputStream FilterReader FilterWriter Strings StringReader StringWriter Data DataInputStream DataOutputStream Data - Formatted PrintStream PrintWriter Objects ObjectInputStream ObjectOutputStream Utilities SequenceInputStream 11 / 36
We/Wy bazuj ce na bajtach 12 / 36
Obsªuga strumieni - przykªad FileInputStream in = null ;... try { // otwarcie strumienia wej±ciowego in = new FileInputStream (...);...... } catch ( IOException ex ) { ex. printstacktrace (); } finally { // zawsze zamykaj I/ O try { if ( in!= null ) in. close (); } catch ( IOException ex ) { ex. printstacktrace (); } } try ( FileInputStream in = new FileInputStream (...)){...... } catch ( IOException ex ) { ex. printstacktrace (); } // Automatycznie zamyka strumien 13 / 36
Opakowywanie strumieni wej±cia/wyj±cia 14 / 36
Przykªad opakowywania FileInputStream filein = new FileInputStream (" in. dat " ); BufferedInputStream bufferin = new BufferedInputStream ( filein ); DataInputStream datain = new DataInputStream ( bufferin ); // lub DataInputStream in = new DataInputStream ( new BufferedInputStream ( new FileInputStream (" in. dat " ))); 15 / 36
Metody DataInputStream public nal int readint() throws IOExcpetion; public nal double readdoube() throws IOExcpetion; public nal byte readbyte() throws IOExcpetion; public nal char readchar() throws IOExcpetion; public nal short readshort() throws IOExcpetion; public nal long readlong() throws IOExcpetion; public nal boolean readboolean() throws IOExcpetion; public nal oat readfloat() throws IOExcpetion; public nal int readunsignedbyte() throws IOExcpetion; public nal int readunsignedshort() throws IOExcpetion; public nal String readline() throws IOException; public nal String readutf() throws IOException; 16 / 36
Metody DataOutputStream public nal void writeint(int i) throws IOExcpetion; public nal void writefloat(oat f) throws IOExcpetion; public nal void writedoube(double d) throws IOExcpetion; public nal void writebyte(int b) throws IOExcpetion; public nal void writeshort(int s) throws IOExcpetion; public nal void writelong(long l) throws IOExcpetion; public nal void writeboolean(boolean b) throws IOExcpetion; public nal void writechar(int i) throws IOExcpetion; public nal void writebytes(string str) throws IOExcpetion; public nal void writechars(string str) throws IOExcpetion; - Big-endian public nal void writeutf(string str) throws IOException; 17 / 36
Strumienie bazuj ce na znakach 18 / 36
Pakiet java.nio.charset tªumaczy z wewn trznego kodowania Java, Unicode (UCS-2), na inne kodowania, np. US-ASCII, ISO-8859-x, UTF-8, UTF-16, UTF-16BE, UTF-16LE, itp. metody: public static SortedMap<String,Charset> availablecharsets() public static Charset defaultcharset() public static Charset forname(string charsetname) public static boolean issupported(string charsetname) aby zmienic domy±ny charset dla JVM: java -Dfile.encoding=UTF-8 TestCharset 19 / 36
Serializacja obiektów i strumienie obiektów (1/2) strumienie danych pozwalaj tylko na zapis i odczyt typów prymitywnych i String strumienie obiektów pozwalaj pój± krok dalej, wi c zapisywa i odczytywa caªe obiekty (równie» struktury danych wraz z danymi) serializacja obiektu jest to proces reprezentacji "pewnego stanu obiektu" za pomoc strumienia bitów w taki sposób, aby ten strumie«bitów mógª by zapisany na no±niku zewn trznym ( dysku czy przez sie ) 20 / 36
Serializacja obiektów i strumienie obiektów (2/2) strumie«bitów stworzony przez serializacj mo»e by pó¹niej u»yty do rekonstrukcji zapisanego stanu obiektu serializacja obiektów jest konieczna, aby przesªa obiekt w sposób trwaªy (persistence) do aplikacji takich jak: web serwisy, aplikacje rozproszone na obiektach (np. Hadoop), Remote Method Invocation (RMI) obiekty, które wymagaj serializacji musz implementowa interfejs java.io.serializable lub java.io.externalizable bardzo du»o obiektów w Javie jest serializowalnych, np. wrapery, kolekcje, klasy GUI 21 / 36
Obsªuga strumieni obiektów - przykªad ObjectOutputStream out = new ObjectOutputStream ( new BufferedOutputStream ( new FileOutputStream ( " object. ser " ))); out. writeobject (" Aktualny czas " ); out. writeobject ( new Date ()); out. flush (); out. close (); ObjectInputStream in = new ObjectInputStream ( new BufferedInputStream ( new FileInputStream ( " object. ser " ))); String str = ( String ) in. readobject (); Date d = ( Date ) in. readobject ( new Date ()); in. close (); 22 / 36
Strumienie obiektów - uwagi typy prymitywne i tablice s domy±lnie serializowalne ObjectInputStream i ObjectOutputStream implementuj DataInput i DataOutput, wi c mo»na u»ywa ich metod takich, jak np. writeint() pola statyczne nie s serializowalne, poniewa» nale» do klasy a nie do obiektu aby nie serializowa wybranych pól nale»y u»y modykatora transient 23 / 36
Wej±cie/wyj±cie w Java 1.7 w Javie 1.7 dodano rozszerzony system obsªugi w pakiecie java.nio.file oraz pakietach powi zanych aby utworzy uchwyt do ±cie»ki nale»y u»y java.nio.file.paths public static Path get(string rst, String... more) public static Path get(uri uri) klasa java.nio.file.files obsªuguje pliki i katalogi klasa Files.walkFileTree() - sªu»y do poruszania si po drzewie katalogów 24 / 36
Kanaªy i bufory kanaª klasy Channel - jest podobny do strumienia, ale nie ma tam blokowania z kanaªu mo»emy wczyta dane do bufora klasy Buffer jest wiele rodzajów kanaªów: FileChannel - czyta i zapisuje dane do pliku DatagramChannel - czyta i zapisuje dane przez sie prze UDP SocketChannel - czyta i zapisuje dane przez sie prze TCP ServerSocketChannel - pozwala nasªuchiwa na poªczenia TCP jak web serwer klasa Selector - pozwala jednemu w tkowi na obsªug wielu kanaªów 25 / 36
Bufory w Java NIO 26 / 36
Pojemno± bufora, pozycja i limit 27 / 36
Klasa java.nio.buer 28 / 36
Klasa Channel i Buer - przykªad RandomAccessFile afile = new RandomAccessFile ( " nio - data. txt ", " rw " ); FileChannel inchannel = afile. getchannel (); ByteBuffer buf = ByteBuffer. allocate (48); int bytesread = inchannel. read ( buf ); while ( bytesread!= -1) { System. out. println (" Read " + bytesread ); buf. flip (); while ( buf. hasremaining ()){ System. out. print (( char ) buf. get ()); } buf. clear (); bytesread = inchannel. read ( buf ); } afile. close (); 29 / 36
Java NIO: Scattering Read ByteBuffer header = ByteBuffer. allocate (128); ByteBuffer body = ByteBuffer. allocate (1024); ByteBuffer [] bufferarray = { header, body }; channel. read ( bufferarray ); 30 / 36
Java NIO: Gathering Write ByteBuffer header = ByteBuffer. allocate (128); ByteBuffer body = ByteBuffer. allocate (1024); // zapis danych do buforów ByteBuffer [] bufferarray = { header, body }; channel. write ( bufferarray ); 31 / 36
Selektor w Java NIO Selector selector = Selector. open (); channel. configureblocking ( false ); SelectionKey key = channel. register ( selector, SelectionKey. OP_READ ) // SelectionKey. OP_CONNECT // SelectionKey. OP_ACCEPT // SelectionKey. OP_READ // SelectionKey. OP_WRITE 32 / 36
Selektor - przykªad Selector selector = Selector. open (); channel. configureblocking ( false ); SelectionKey key = channel. register ( selector, SelectionKey. OP_READ ) while ( true ) { int readychannels = selector. select (); if ( readychannels == 0) continue ; Set < SelectionKey > selectedkeys = selector. selectedkeys (); Iterator < SelectionKey > keyiterator = selectedkeys. iterator (); while ( keyiterator. hasnext ()) { SelectionKey key = keyiterator. next (); if ( key. isacceptable ()) { // a connection was accepted by a ServerSocketChannel. } else if ( key. isconnectable ()) { // a connection was established with a remote server. } else if ( key. isreadable ()) { // a channel is ready for reading } else if ( key. iswritable ()) { // a channel is ready for writing } keyiterator. remove (); } 33 / 36 }
Java IO vs Java NIO (1/2) 34 / 36
Java IO vs Java NIO (2/2) Java NIO - pojedynczy w tek obsªuguje wiele poª cze«java IO - jadno poª czenie jest obsªugiwane przez jeden watek 35 / 36
36 / 36 Pytania?