#NIO --- Java NIO(New IO)æ¯ä¸ä¸ªå¯ä»¥æ¿ä»£æ åJava IO APIçIO API(ä»Java1.4å¼å§)ï¼Java NIOæä¾äºä¸æ åIOä¸åçIO工使¹å¼ã ###Java NIO: Channels and Buffersï¼ééåç¼å²åºï¼ æ åçä¿IOåºäºåèæµåå符æµè¿è¡æä½çï¼èNIOæ¯åºäºéé(Channel)åç¼å²åº(Buffer)è¿è¡æä½ï¼æ°æ®æ»æ¯ä»éé读åå°ç¼å²åºä¸ï¼æè ä»ç¼å²åºåå ¥ééä¹ç±»ä¼¼ã ###Java NIO: Non-blocking IOï¼éé»å¡IOï¼ Java NIOå¯ä»¥è®©ä½ éé»å¡ç使ç¨IOï¼ä¾å¦ï¼å½çº¿ç¨ä»ééè¯»åæ°æ®å°ç¼å²åºæ¶ï¼çº¿ç¨è¿æ¯è¿è¡å ¶ä»äºæ ã彿°æ®è¢«åå ¥å°ç¼å²åºæ¶ï¼çº¿ç¨å¯ä»¥ç»§ç»å¤çå®ãä»ç¼å²åºåå ¥ééä¹ç±»ä¼¼ã ###Java NIO: Selectors(éæ©å¨) Java NIOå¼å ¥äºéæ©å¨çæ¦å¿µï¼éæ©å¨ç¨äºçå¬å¤ä¸ªééçäºä»¶(æ¯å¦ï¼è¿æ¥æå¼ï¼æ°æ®å°è¾¾)ãå æ¤ï¼å个ç线ç¨å¯ä»¥çå¬å¤ä¸ªæ°æ®ééã NIOç±ä»¥ä¸æ ¸å¿é¨åç»æï¼ * Channels * Buffers * Selectors **ChannelåBuffer** åºæ¬ä¸ï¼ææçIOåNIOé½ä»ä¸ä¸ªChannelå¼å§ãChannelæç¹åæµãæ°æ®å¯ä»¥ä»Channel读å°Bufferä¸ï¼ä¹å¯ä»¥ä»Bufferåå°Channelä¸  Channelçå®ç° * FileChannel * DatagramChannel * SocketChannel * ServerSocketChannel è¿äºééæ¶µçäºUDPåTCPç½ç»IOï¼ä»¥åæä»¶IOã 以䏿¯Java NIOéå ³é®çBufferå®ç° * ByteBuffer * CharBuffer * DoubleBuffer * FloatBuffer * IntBuffer * LongBuffer * ShortBuffer è¿äºBufferè¦çäºä½ è½éè¿IOåéçåºæ¬æ°æ®ç±»åï¼byte,short,int,long,float,doubleåchar Java NIOè¿æä¸ªMappedByteBufferï¼ç¨äºè¡¨ç¤ºå åæ å°æä»¶ã **Selextor** Selectorå 许å线ç¨å¤çå¤ä¸ªChannelãå¦æä½ çåºç¨æå¼äºå¤ä¸ªè¿æ¥(éé)ï¼ä½æ¯ä¸ä¸ªè¿æ¥çæµéé½å¾ä½ï¼ä½¿ç¨Selectorå°±ä¼å¾æ¹ä¾¿ã ä¾å¦ï¼å¨ä¸ä¸ªè天æå¡å¨ä¸ è¿æ¯å¨ä¸ä¸ªå线ç¨ä¸ä½¿ç¨ä¸ä¸ªSelectorå¤ç3个Channelçå¾ç¤ºï¼  è¦ä½¿ç¨Selectorï¼å¾åSelector注åChannelï¼ç¶åè°ç¨å®çselect()æ¹æ³ãè¿ä¸ªæ¹æ³ä¼ä¸ç´é»å¡å°æä¸ªæ³¨åçééæäºä»¶å°±ç»ªã䏿¦è¿ä¸ªæ¹æ³è¿åï¼çº¿ç¨å°±å¯ä»¥å¤çè¿äºäºä»¶ï¼äºä»¶çä¾åæå¦æ°è¿æ¥è¿æ¥ï¼æ°æ®æ¥éçã ##Channel --- Java NIOçéé类似æµï¼ä½åæäºä¸åï¼ * æ¢å¯ä»¥ä»ééä¸è¯»åæ°æ®ï¼åå¯ä»¥åæ°æ®å°ééã使µç读åé常æ¯ååçã * ééå¯ä»¥å¼æ¥ç读åã * ééçæ°æ®æ»æ¯è¦å 读å°ä¸ä¸ªBufferï¼æè æ»è¦ä»ä¸ä¸ªBufferä¸åå ¥ã æ£å¦ä¸é¢æè¯´ï¼ä»ééè¯»åæ°æ®å°ç¼å²åºï¼ä»ç¼å²åºåå ¥æ°æ®å°ééã **Channelçå®ç°** * FileChannel 仿件ä¸è¯»åæ°æ® * DataChannel è½éè¿UDP读åç½ç»ä¸çæ°æ® * SocketChannel è½éè¿TCP读åç½ç»ä¸çæ°æ® * ServerSocketChannel å¯ä»¥ç嬿°è¿æ¥çTCPè¿æ¥ï¼åWebæå¡å¨é£æ ·ã对æ¯ä¸ä¸ªæ°è¿æ¥çè¿æ¥é½ä¼å建ä¸ä¸ªSocketChannel åºæ¬çChannelç¤ºä¾ ä¸é¢æ¯ä¸ä¸ªä½¿ç¨FileChannelè¯»åæ°æ®å°Bufferä¸çç¤ºä¾ ``` RandomAccessFile aFile = new RandomAccessFile("data/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(); ``` 注æ buf.flip() çè°ç¨ï¼é¦å è¯»åæ°æ®å°Bufferï¼ç¶åå转Buffer,æ¥çåä»Bufferä¸è¯»åæ°æ®ã ##Buffer Java NIOä¸çBufferç¨äºåNIOééè¿è¡äº¤äºãå¦ä½ æç¥ï¼æ°æ®æ¯ä»ééè¯»å ¥ç¼å²åºï¼ä»ç¼å²åºåå ¥å°ééä¸çã ç¼å²åºæ¬è´¨æ¯ä¸åå¯ä»¥åå ¥æ°æ®ï¼ç¶åå¯ä»¥ä»ä¸è¯»åæ°æ®çå åãè¿åå å被å è£ æNIO Buffer对象ï¼å¹¶æä¾äºä¸ç»æ¹æ³ï¼ç¨æ¥æ¹ä¾¿ç访é®è¿åå åã **Bufferçåºæ¬ç¨æ³** 使ç¨Bufferè¯»åæ°æ®ä¸è¬éµå¾ªä»¥ä¸å个æ¥éª¤ï¼ 1. åå ¥æ°æ®å°Buffer 2. è°ç¨flip()æ¹æ³ 3. ä»Bufferä¸è¯»åæ°æ® 4. è°ç¨clear()æ¹æ³æè compact()æ¹æ³