* [????](#????) * [???????](#???????) * [??????](#??????) * [???????](#???????) * [???????](#???????) * [???????](#???????) * [1. InetAddress](#1-inetaddress) * [2. URL](#2-url) * [3. Sockets](#3-sockets) * [4. Datagram](#4-datagram) * [NIO](#nio) * [1. ?????](#1-?????) * [2. ?????????](#2-?????????) * [2.1 ???](#21-???) * [2.2 ??????](#22-??????) * [3. ????????????](#3-????????????) * [4. ??§Õ??????](#4-??§Õ??????) * [5. ???????????](#5-???????????) * [5.1 ????? I/O](#51-?????-io) * [5.2 ??????? I/O](#52-???????-io) * [6. ????????](#6-????????) * [6.1 ServerSocketChannel](#61-serversocketchannel) * [6.2 Selectors](#62-selectors) * [6.3 ?????](#63-?????) * [6.4 ??????????](#64-??????????) * [6.5 ???????????](#65-???????????) * [6.6 ?????????? SelectionKey](#66-??????????-selectionkey) * [6.7 ????? I/O](#67-?????-io) * [?¦Ï?????](#?¦Ï?????) # ???? Java ?? I/O ??????????????? 1. ?????????File 2. ????????InputStream ?? OutputStream 3. ?????????Reader ?? Writer 4. ?????????Serializable 5. ?????????Socket 6. ??????? IO??NIO # ??????? File ???????????????????????????????????????????????????????????? # ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8143787f-12eb-46ea-9bc3-c66d22d35285.jpg) Java I/O ???????????????????? InputStream ?????InputStream ??????????FileInputStream ?? InputStream ??????????????????????????????????????FilterInputStream ????????????????????????????????????????????????? BufferedInputStream ? FileInputStream ??????????????????????§Ý??œ¤????????????????????? FileInputStream ????????????? BufferedInputStream ????¨À? ```java BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); ``` DataInputStream ?????????????????????????????????????? int??double ?????????? ????????????§Ö??????????????? ```java byte[] buf = new byte[20*1024]; int bytes = 0; // ????? buf.length ????????????????????????????? -1 ??????????? eof???????¦Â while((bytes = in.read(buf, 0 , buf.length)) != -1) { // ... } ``` # ??????? ???????????????×Ï????§³??›¥?????????????????????????? I/O ????????????????????????????????§Ó??????????????????????????????????????§Ó?????????? InputStreamReader ?????????????????????????????OutputStreamWriter ??????????????????????????????????????? Reader ?? Writer?? ???????????????????????????????????????????? ```java byte[] bytes = str.getBytes(encoding); // ???? String str = new String(bytes, encoding)?? // ???? ``` GBK ?????§µ?????? 2 ?????????? 1 ??????UTF-8 ?????§µ?????? 3 ?????????? 1 ??????Java ?????????? UTF-16be???????????? 2 ?????? ????????????????¨°?????????????????????? # ??????? ???§Ý????????????????????????§µ?????›¥????? ???§Ý???ObjectOutputStream.writeObject() ?????§Ý???ObjectInputStream.readObject() ???§Ý??????????? Serializable ?????????????????????¦Ê¦Ç?????????? transient ??????????§»??????????§Ý??? **ArrayList ???§Ý???????§Ý??????**??ArrayList ?§Õ›¥????????????? transient ???¦Å???????????????????????????????§Ö????????????????????§Ö???????????§Ý????????§Õ???§Ý???????§Ý?????????????????§Ý???????????????????????? ``` private transient Object[] elementData; ``` # ??????? Java ?§Ö????????? 1. InetAddress????????????????????????? IP ????? 2. URL?????????¦Ë??????? URL ?????????????§Õ?????????????? 3. Sockets????? TCP §¿????????????? 4. Datagram????? UDP §¿????????????? ## 1. InetAddress ??§Û??§Û??????????????????????????????????? InetAddress.getByName(String host)??InetAddress.getByAddress(byte[] addr)?? ## 2. URL ???????? URL ?§Ø??????????? ```java URL url = new URL("http://www.baidu.com"); InputStream is = url.openStream(); // ????? InputStreamReader isr = new InputStreamReader(is, "utf-8"); // ????? BufferedReader br = new BufferedReader(isr); String line = br.readLine(); while (line != null) { System.out.println(line); line = br.readLine(); } br.close(); isr.close(); is.close(); ``` ## 3. Sockets Socket ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/fa4101d7-19ce-4a69-a84f-20bbe64320e5.jpg) - ServerSocket???????????? - Socket????????? ??????????????? InputStream ?? OutputStream ????????????? ## 4. Datagram - DatagramPacket????????? - DatagramSocket??????? # NIO NIO ???????? I/O ???? ( ??????????????? ) ?????????????? ?????????????????????????????????? ## 1. ????? I/O ?? NIO ?????????????????????????????????????????I/O ??????????????????? NIO ??????????????? ???????? I/O ???????????§Õ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? I/O ????????? ????????? I/O ??????????????????????????????????§Ó??????????????????î•???ø„????????????????????????????????? I/O ????§»???????? I/O ?????§Ö???????????? I/O ???? NIO ?????????????java.io.\* ????? NIO ????????????????????????????????? NIO ???§»????????íà java.io.\* ???§Ö??§»??????????????§Õ??????????????¨¹????????????????§µ?????????????? ## 2. ????????? ### 2.1 ??? ??? Channel ???? I/O ???§Ö??????????????????????§Õ??????? ????????????????????????????????????????(??????????? InputStream ???? OutputStream ??????)?? ???????????????????????§Õ???????????§Õ?? ???????????????? - FileChannel????????§Ø?§Õ????? - DatagramChannel????? UDP ??§Õ??????????? - SocketChannel????? TCP ??§Õ??????????? - ServerSocketChannel???????????????? TCP ?????????????????????????????? SocketChannel?? ### 2.2 ?????? ????????????????§Ø???????????????????§µ?????????????§Ø?????¦Ê??????????????????§³???????????????????????§Ø?§Õ?????????????????????? ???????????????????ï…??????????????????î•?????????????????????????????????????????/§Õ????? ??????????????????? - ByteBuffer - CharBuffer - ShortBuffer - IntBuffer - LongBuffer - FloatBuffer - DoubleBuffer ## 3. ???????????? - capacity??????????? - position??????????§Õ????????? - limit?????????§Õ????????? ?????????????? 1\. ????????§³? 8 ???????????????? position ? 0???? limit == capacity == 9??capacity ??????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1bea398f-17a7-4f67-a90b-9e2d243eaa9a.png) 2\. ??????????§Ø?? 3 ?????????§Õ???????§µ???? position ?????? 3??limit ??????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/4628274c-25b6-4053-97cf-d1239b44c43d.png) 3\. ???????????????§Õ???????????????????? flip() ??????????????? limit ???????? position?????? position ????? 0?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/952e06bd-5a65-4cab-82e4-dd1536462f38.png) 4\. ?????????? 4 ??????????????§µ???? position ??? 4?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b5bdcbe2-b958-4aef-9151-6ad963cb28b4.png) 5\. ?????????? clear() ??????????????????? position ?? limit ????????????¦Ë?¨¢? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/67bf5487-c45d-49b6-b9c0-a058d8c68902.png) ## 4. ??§Õ?????? 1\. ?????????????? FileInputStream???????? FileInputStream ??????? FileChannel?? ```java FileInputStream fin = new FileInputStream("readandshow.txt"); FileChannel fic = fin.getChannel(); ``` 2\. ???????????? 1024 ?? Buffer ```java ByteBuffer buffer = ByteBuffer.allocate(1024); ``` 3\. ??????????? FileChannel §Õ?? Buffer ?§µ??????????????? read() ???????? -1 ```java int r = fcin.read(buffer); if (r == -1) { break; } ``` 4\. ??§Õ?????????? FileOutputStream???????? FileOutputStream ?????? FileChannel ```java FileOutputStream fout = new FileOutputStream("writesomebytes.txt"); FileChannel foc = fout.getChannel(); ``` 5\. ???? flip() ?§Ý???§Õ ```java buffer.flip(); ``` 6\. ?? Buffer ?§Ö???????????? FileChannel ?? ```java foc.write(buffer); ``` 7\. ?????? clear() ????????? ```java buffer.clear(); ``` ## 5. ??????????? ??????FileChannel ?????§Ý?????????????????? Channel ????? ### 5.1 ????? I/O ????? I/O ????? InputStream.read() ?????????????????????????????????????? ServerSocket.accept() ???????????????????§á?????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/edc23f99-c46c-4200-b64e-07516828720d.jpg) ### 5.2 ??????? I/O ?????????????????????§Ö? I/O ??????????????? ?????????????????????????????????????????????? ???????????????? wait()??notify() ?????????????????????§Ý???????????????????¦Í??????§Ý??? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/7fcb2fb0-2cd9-4396-bc2d-282becf963c3.jpg) ## 6. ???????? ### 6.1 ServerSocketChannel ???????????????? ServerSocketChannel ????????????? ```java ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); // ??????????? ServerSocket ss = ssc.socket(); InetSocketAddress address = new InetSocketAddress(ports[i]); ss.bind(address); // ????? ``` ### 6.2 Selectors ?? I/O ??? Selector ??????? I/O ???????? ?D ????????????????????????????????????????????????????????? ???? Selectors ?????????????????????? register() ??????register() ????????????????? Selector????????????? OP_ACCEPT?????????????????????? accept ???????????????????????????????????? SelectionKey ????????????? Selector ?????????????? Selector ????????????????????????????????????? SelectionKey ?????§Ö??SelectionKey ????????????????????? ```java Selector selector = Selector.open(); SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT); ``` ### 6.3 ????? ???????????? Selector ?? select() ??????????????????????????????????????????????????????????????????????? select() ????????????????????????????? ??????????????? Selector ?? selectedKeys() ?????????????????????? SelectionKey ???????? ???? ?? ??????????? SelectionKeys ?????¦Ä?????? SelectionKey ??????????????????? SelectionKey????????????????????? I/O ???????????????????§» I/O ???? ```java int num = selector.select(); Set selectedKeys = selector.selectedKeys(); Iterator it = selectedKeys.iterator(); while (it.hasNext()) { SelectionKey key = (SelectionKey)it.next(); // ... deal with I/O event ... } ``` ### 6.4 ?????????? ??????§Ö??????????????? ServerSocketChannel??????????????????????????????????????? SelectionKey ???? readyOps() ??????????ú€???????????????? ```java if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) { // Accept the new connection // ... } ``` ??????????? readOps() ?????????????????????????? ### 6.5 ??????????? ?????????????????????????????????????????????????????????????????????????????? accept() ???????????? ```java ServerSocketChannel ssc = (ServerSocketChannel)key.channel(); SocketChannel sc = ssc.accept(); ``` ??????????????? SocketChannel ??????????????????????????????????????????????????????????????????????? SocketChannel ??? Selector???????????? ```java sc.configureBlocking( false ); SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ ); ``` ?????????? register() ?? OP_READ ???????? SocketChannel ??????? ??? ?????? ???? ??????? ### 6.6 ?????????? SelectionKey ????? SelectionKey ???????????????????????????????????????????????? SelectionKey ????????????????????????????????????????????????????????????????????????????????????????????¦Ä????????????????????? remove() ???????????????? SelectionKey?? ```java it.remove(); ``` ???????????????????????????????????§Õ????????(???????????? I/O ???)??? ### 6.7 ????? I/O ?????????????????????????????????? I/O ??????????????????§Ö??? Selector.select()????????????????? I/O ?????????¦²? SelectionKey ???????? OP_READ ?????????????? ```java } else if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) { // Read the data SocketChannel sc = (SocketChannel)key.channel(); // ... } ``` # ?¦Ï????? - Eckel B, ????? , ??? , ?? . Java ?????? [M]. ??§Ö????????? , 2002. - [IBM: NIO ????](https://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html) - [ ??????? Java I/O ????????? ](https://www.ibm.com/developerworks/cn/java/j-lo-javaio/index.html) - [NIO ??? IO ?????? ](http://blog.csdn.net/shimiso/article/details/24990499)