# IOç®ä» ``` IOæ¯Javaä¸çä¸ç§è¾å ¥åè¾åºçåè½ï¼Javaä¸å¯¹è¿ç§æä½å«å对æµçæä½ã æµä»£è¡¨çæ¯ä»»ä½æè½åäº§åºæ°æ®çæ°æ®æºå¯¹è±¡æè æ¯æè½åæ¥åæ°æ®çæ¥æ¶ç«¯å¯¹è±¡ã æµçæ¬è´¨æ¯æ°æ®ä¼ è¾ï¼æµä¸åªæ¯å¯¹æä»¶å¯è¿è¡è¯»åï¼è¿å¯ä»¥å¯¹å åãç½ç»ãç¨åºæä½ã ``` ## å¦ä¹ 计å * [Java IOãNIOåç](https://www.jianshu.com/p/63d1c4476f45) * [讲çæå¥½ç忥/弿¥/é»å¡/éé»å¡/BIO/NIO/AIOçæç« ](http://note.youdao.com/noteshare?id=e00d8caf0973471780b8ca880e1c5bf9&sub=wcp1578879502523399) * [é¶æ·è´](http://note.youdao.com/noteshare?id=13101142e0a628da85eca4a52df1596b&sub=wcp1579073093657123) * [å¦ä½å¦ä¹ JavaçNIO](http://note.youdao.com/noteshare?id=5ea48ae4fd97f7a7bb4bd9d036ba4d11) * [ä¸ç¯æç« 读æé»å¡ï¼éé»å¡ï¼åæ¥ï¼å¼æ¥](https://www.jianshu.com/p/b8203d46895c) * ç»åä»£ç æ¥çè§£ï¼è¿ç¯æç« æå°äºåºå±çåçï¼ä½æ¯ä¸å¤æ·±å ¥ * https://blog.csdn.net/qq_41936805/article/details/94675873 帮å©çè§£å¤è·¯å¤ç¨ * http://www.imooc.com/article/255865 æä»£ç å¯ä»¥çä¸ * [æä½ç³»ç»IOå¤çè¿ç¨](https://blog.csdn.net/hutongling/article/details/69944456) * [Java IO屿¬¡ä½ç³»ç»æ](https://blog.csdn.net/qq_21870555/article/details/82999195) * [IOå¤è·¯å¤ç¨](https://www.jianshu.com/p/397449cadc9a) ## å¦ä¹ ç¬è®° NIOæ¯åæ¥çIOï¼æ¯å 为ç¨åºéè¦IOæä½æ¶ï¼å¿ é¡»è·å¾äºIOæéå亲èªè¿è¡IOæä½æè½è¿è¡ä¸ä¸æ¥æä½ãAIOæ¯å¯¹NIOçæ¹è¿ï¼æä»¥AIOåå«NIO.2ï¼ï¼å®æ¯åºäºProactor模åçãæ¯ä¸ªsocketè¿æ¥å¨äºä»¶åç¦»å¨æ³¨å IO宿äºä»¶ å IO宿äºä»¶å¤çå¨ãç¨åºéè¦è¿è¡IOæ¶ï¼åå离å¨ååºIO请æ±å¹¶ææç¨çBufferåºååç¥å离å¨ï¼å离å¨éç¥æä½ç³»ç»è¿è¡IOæä½ï¼æä½ç³»ç»èªå·±ä¸æå°è¯è·åIOæéå¹¶è¿è¡IOæä½ï¼æ°æ®ä¿åå¨Bufferåºï¼ï¼æä½å®æåéç¥å离å¨ï¼åç¦»å¨æ£æµå° IO宿äºä»¶ï¼åæ¿æ´» IO宿äºä»¶å¤çå¨ï¼å¤çå¨ä¼éç¥ç¨åºè¯´âIO已宿âï¼ç¨åºç¥éåå°±ç´æ¥ä»Bufferåºè¿è¡æ°æ®ç读åã ä¹å°±æ¯è¯´ï¼AIOæ¯ååºIO请æ±åï¼ç±æä½ç³»ç»èªå·±å»è·åIOæéå¹¶è¿è¡IOæä½ï¼NIO忝ååºIO请æ±åï¼ç±çº¿ç¨ä¸æå°è¯è·åIOæéï¼è·åå°åéç¥åºç¨ç¨åºèªå·±è¿è¡IOæä½ã 忥/弿¥ï¼æ°æ®å¦æå°æªå°±ç»ªï¼æ¯å¦éè¦çå¾ æ°æ®ç»æã é»å¡/éé»å¡ï¼è¿ç¨/线ç¨éè¦æä½çæ°æ®å¦æå°æªå°±ç»ªï¼æ¯å¦å¦¨ç¢äºå½åè¿ç¨/线ç¨çåç»æä½ãåºç¨ç¨åºçè°ç¨æ¯å¦ç«å³è¿åï¼ NIOä¸BIOæå¤§çåºå«æ¯ BIOæ¯é¢åæµçï¼èNIOæ¯é¢åBufferçã Bufferæ¯ä¸åè¿ç»çå åå,æ¯ NIO æ°æ®è¯»æåçä¸è½¬å°ã 为ä»ä¹è¯´NIOæ¯åºäºç¼å²åºçIOæ¹å¼å¢ï¼å 为ï¼å½ä¸ä¸ªé¾æ¥å»ºç«å®æåï¼IOçæ°æ®æªå¿ ä¼é©¬ä¸å°è¾¾ï¼ä¸ºäºå½æ°æ®å°è¾¾æ¶è½å¤æ£ç¡®å®æIOæä½ï¼å¨BIOï¼é»å¡IOï¼ä¸ï¼çå¾ IOç线ç¨å¿ 须被é»å¡ï¼ä»¥å ¨å¤©åå°æ§è¡IOæä½ã为äºè§£å³è¿ç§IOæ¹å¼ä½æçé®é¢ï¼å¼å ¥äºç¼å²åºçæ¦å¿µï¼å½æ°æ®å°è¾¾æ¶ï¼å¯ä»¥é¢å 被åå ¥ç¼å²åºï¼åç±ç¼å²åºäº¤ç»çº¿ç¨ï¼å æ¤çº¿ç¨æ éé»å¡å°çå¾ IOã ããç¼å²åºå®é 䏿¯ä¸ä¸ªå®¹å¨å¯¹è±¡ï¼æ´ç´æ¥ç说ï¼å ¶å®å°±æ¯ä¸ä¸ªæ°ç»ï¼å¨NIO åºä¸ï¼æææ°æ®é½æ¯ç¨ç¼å²åºå¤ççãå¨è¯»åæ°æ®æ¶ï¼å®æ¯ç´æ¥è¯»å°ç¼å²åºä¸çï¼ å¨åå ¥æ°æ®æ¶ï¼å®ä¹æ¯åå ¥å°ç¼å²åºä¸çï¼ä»»ä½æ¶å访é®NIO ä¸çæ°æ®ï¼é½æ¯å°å®æ¾å°ç¼å²åºä¸ãèå¨é¢åæµI/O ç³»ç»ä¸ï¼æææ°æ®é½æ¯ç´æ¥åå ¥æè ç´æ¥å°æ°æ®è¯»åå°Stream 对象ä¸ãå¨NIO ä¸ï¼ææçç¼å²åºç±»åé½ç»§æ¿äºæ½è±¡ç±»Bufferï¼æå¸¸ç¨çå°±æ¯ByteBuffer # Java IOä¸å¸¸ç¨çç±» ``` æ´ä¸ªJava IOå 䏿éè¦çå°±æ¯5个类åä¸ä¸ªæ¥å£ã 5个类æï¼ * Fileï¼ç¨äºæä»¶æè ç®å½çæè¿°ä¿¡æ¯ï¼ä¾å¦çææ°çç®å½ï¼ä¿®æ¹æä»¶åï¼å 餿件ï¼å¤ææä»¶ï¼è¿æ»¤æä»¶ç * OutputStreamï¼æ½è±¡ç±»ï¼åºäºåèçè¾åºæä½ï¼æ¯ææè¾åºæµçç¶ç±»ã * InputStreamï¼æ½è±¡ç±»ï¼åºäºåèçè¾å ¥æä½ï¼æ¯ææè¾å ¥æµçç¶ç±»ã * Writerï¼æ½è±¡ç±»ï¼åºäºå符çè¾åºæä½ã * Readerï¼æ½è±¡ç±»ï¼åºäºå符çè¾å ¥æä½ã ä¸ä¸ªæ¥å£æï¼Serializable å¦å¤ä¸ä¸ªç¹æ®çç±»ï¼RandomAccessFileï¼éæºæä»¶æä½ï¼å¯ä»¥ä»æä»¶ä»»æä½ç½®è¿è¡ååï¼è¾å ¥è¾åºï¼æä½ã ``` `IOæ¥å£åç±»çç»æå¾å¯åèææ¯æ å¾` ## RandomAccessFile ``` æä»¬å¨å¯¹æä»¶çæä½è¿ç¨ä¸ï¼é¤äºä½¿ç¨åèæµåå符æµçæ¹å¼ä¹å¤ï¼æä»¬è¿å¯ä»¥ä½¿ç¨RandomAcessFileè¿ä¸ªå·¥å ·ç±»æ¥å®ç°ã RandomAccessFileå¯ä»¥å®ç°å¯¹æä»¶ç读 å åï¼ä½æ¯ä»å¹¶ä¸æ¯ç»§æ¿äºä»¥ä¸4ä¸åºæ¬èæç±»ã èä¸å¨å¯¹æä»¶çæä½ä¸ï¼RandomAccessFileæä¸ä¸ªå·¨å¤§çä¼å¿ï¼ä»å¯ä»¥æ¯ææä»¶çéæºè®¿é®ï¼ç¨åºå¿«å¯ä»¥ç´æ¥è·³è½¬å°æä»¶çä»»æå°æ¹æ¥è¯»åæ°æ®ãæä»¥å¦æéè¦è®¿é®æä»¶çé¨åå 容ï¼è䏿¯ææä»¶ä»å¤´è¯»å°å°¾ï¼ä½¿ç¨RandomAccessFileå°æ¯æ´å¥½çéæ©ã RandomAccessFileçæ¹æ³è½ç¶å¤ï¼ä½å®æä¸ä¸ªæå¤§çå±éï¼å°±æ¯åªè½è¯»åæä»¶ï¼ä¸è½è¯»åå ¶ä»IOèç¹ã RandomAccessFileçä¸ä¸ªéè¦ä½¿ç¨åºæ¯å°±æ¯ç½ç»è¯·æ±ä¸çå¤çº¿ç¨ä¸è½½åæç¹ç»ä¼ ã ``` # å符ä¸åè Java䏿è¾å ¥åè¾åºä¸¤ç§IOæµï¼æ¯ç§è¾å ¥è¾åºæµåå为åèæµåå符æµä¸¤å¤§ç±»ã * å ³äºåèï¼æ¯ä¸ªåèï¼byteï¼æ8bitç»æ * å ³äºå符ï¼ä¸ä¸ªå符代表ä¸ä¸ªè±æåæ¯æä¸ä¸ªæ±å ## å符ä¸åèçå ³ç³» Javaéç¨unicodeç¼ç ï¼2个åè表示1个å符 # æ»ç» * å è¿å åºï¼æå åå ¥è¾åºæµçæ°æ®æå 被è¾å ¥æµè¯»åå° * 顺åºè¯»åï¼ä¸è½éæºè®¿é®æ°æ®ï¼RandomAccessFileé¤å¤ï¼ * åªè¯»åªåï¼æ¯ä¸ªæµåªè½æ¯è¾å ¥æµæè¾åºæµçä¸ç§ * æ¯æ¬¡è¿è¡IOæä½ï¼è¦æå¨closeï¼å 为IOèµæºå¹¶ä¸å±äºå åèµæºï¼å¹¶ä¸ä¼è¢«GCåæ¶ * 对äºè¾åºæä½ï¼flush()ä¼å·æ°è¾åºæµï¼å¼ºå¶ç¼å²åºä¸çè¾åºåè被ååº; close()å ³éè¾åºæµï¼éæ¾åè¿ä¸ªæµç¸å ³çç³»ç»èµæºï¼è°ç¨close()ä¼èªå¨flush * æµç»æçå¤æï¼æ¹æ³read()çè¿åå¼ä¸º-1æ¶ï¼readLine()çè¿åå¼ä¸ºnullæ¶ * èæµæ²¡æç¼å²åºï¼æ¯ç´æ¥è¾åºçï¼èåç¬¦æµæ¯è¾åºå°ç¼å²åºçãå æ¤å¨è¾åºæ¶ï¼åèæµä¸è°ç¨colse()æ¹æ³æ¶ï¼ä¿¡æ¯å·²ç»è¾åºäºï¼èå符æµåªæå¨è°ç¨close()æ¹æ³å ³éç¼å²åºæ¶ï¼ä¿¡æ¯æè¾åºãè¦æ³å符æµå¨æªå ³éæ¶è¾åºä¿¡æ¯ï¼åéè¦æå¨è°ç¨flush()æ¹æ³ * åèæµä¸å符æµåºå« * åèæµä»¥åèï¼8bitï¼ä¸ºåä½ï¼å符æµä»¥å符为åä½ï¼æ ¹æ®ç 表æ å°å符ï¼ä¸æ¬¡å¯è½è¯»å¤ä¸ªåè * åèæµè½å¤çææç±»åçæ°æ®ï¼å¦å¾çãaviçï¼ï¼èå符æµåªè½å¤çå符类åçæ°æ® * åªè¦æ¯å¤ççº¯ææ¬æ°æ®ï¼å°±ä¼å èè使ç¨å符æµã餿¤ä¹å¤é½ä½¿ç¨åèæµ # Java IOä¸IOçåºå«åæ¯è¾ # NIO ä¼ ç»ç Socket é»å¡æ¨¡å¼ç´æ¥å¯¼è´æ¯ä¸ª Socket é½å¿ é¡»ç»å®ä¸ä¸ªçº¿ç¨æ¥æä½æ°æ®ï¼åä¸éä¿¡çä»»æä¸æ¹å¦æå¤çæ°æ®çéåº¦è¾æ ¢ï¼åé½ä¼ç´æ¥æç´¯å¦ä¸æ¹ï¼å¯¼è´å¦ä¸æ¹ç线ç¨ä¸å¾ä¸æµªè´¹å¤§éçæ¶é´å¨ I/O çå¾ ä¸ï¼æä»¥ï¼æ¯ä¸ª Socket è¦ç»å®ä¸ä¸ªåç¬ççº¿ç¨æ£æ¯ä¼ ç»Socket é»å¡æ¨¡å¼çæ ¹æ¬â缺é·âã乿以è¿éå äºâ缺é·â两个åï¼æ¯å 为è¿ç§æ¨¡å¼å¨ä¸äºç¹å®åºåä¸æææ¯æå¥½çï¼æ¯å¦åªæå°éç TCP è¿æ¥éä¿¡ï¼åæ¹é½é常快éå°ä¼ è¾æ°æ®ï¼æ¤æ¶è¿ç§æ¨¡å¼çæ§è½æé«ã ç°å¨æä»¬å¯ä»¥å¼å§åæâéé»å¡â模å¼äºï¼å®å°±æ¯è¦è§£å³ I/O 线ç¨ä¸ Socket è§£è¦çé®é¢ï¼å æ¤ï¼å®å¼å ¥äºäºä»¶æºå¶æ¥è¾¾å°è§£è¦çç®çãæä»¬å¯ä»¥è®¤ä¸º NIO åºå±ä¸åå¨ä¸ä¸ª I/O è°åº¦çº¿ç¨ï¼å®ä¸ææ«ææ¯ä¸ª Socket çç¼å²åºï¼å½åç°åå ¥ç¼å²åºä¸ºç©ºï¼æè 䏿»¡ï¼çæ¶åï¼å®ä¼äº§çä¸ä¸ªSocket å¯åäºä»¶ï¼æ¤æ¶ç¨åºå°±å¯ä»¥ææ°æ®åå ¥ Socket éï¼å¦æä¸æ¬¡åä¸å®ï¼åçå¾ ä¸æ¬¡å¯åäºä»¶çéç¥ï¼èå½åç°è¯»åç¼å²åºéææ°æ®çæ¶åï¼å®ä¼äº§çä¸ä¸ª Socket å¯è¯»äºä»¶ï¼ç¨åºæ¶å°è¿ä¸ªéç¥äºä»¶æ¶ï¼å°±å¯ä»¥ä» Socket è¯»åæ°æ®äºã å æ ¸ç©ºé´ãç¨æ·ç©ºé´ãè®¡ç®æºä½ç³»ç»æãè®¡ç®æºç»æåçãâ¦â¦ ç¡®å®æç¹å¿æ·±å¥¥ã æçæ°ä¹¦ã代ç ä¹è°ã伿ä¸é¨çç« è讲解ç¸å ³ç¥è¯ï¼ç°å¨å个ç®ççç§æ®æï¼ å°±é度æ¥è¯´ CPU > å å > 硬ç I- å°±æ¯ä»ç¡¬çå°å å O- å°±æ¯ä»å åå°ç¡¬ç 第ä¸ç§æ¹å¼ï¼æä»ç¡¬çè¯»åæ°æ®ï¼ç¶åç¨åºä¸ç´çï¼æ°æ®è¯»å®åï¼ç»§ç»æä½ãè¿ç§æ¹å¼æ¯æç®åçï¼å«é»å¡IOã 第äºç§æ¹å¼ï¼æä»ç¡¬çè¯»åæ°æ®ï¼ç¶åç¨åºç»§ç»å䏿§è¡ï¼çæ°æ®è¯»åå®åï¼éç¥å½åç¨åºï¼å¯¹ç¡¬ä»¶æ¥è¯´å«ä¸æï¼å¯¹ç¨åºæ¥è¯´å«åè°ï¼ï¼ç¶åæ¤ç¨åºå¯ä»¥ç«å³å¤çæ°æ®ï¼ä¹å¯ä»¥æ§è¡å®å½åæä½å¨è¯»åæ°æ®ã å¨ä¸èµ·ç Java IO ä¸ï¼é½æ¯é»å¡å¼ IOï¼NIO å¼å ¥äºéé»å¡å¼ IOã è¿æä¸ç§å°±æ¯åæ¥ IO å弿¥ IOãç»å¸¸è¯´çä¸ä¸ªæ¯è¯å°±æ¯â弿¥éé»å¡âï¼å¥½è±¡å¼æ¥åéé»å¡æ¯åä¸åäºï¼è¿å¤§æ¦æ¯ä¸ä¸ªè¯¯åºå§ã è³äº Java NIO ç Selectorï¼å¨æ§ç Java IO ç³»ç»ä¸ï¼æ¯åºäº Stream çï¼å³âæµâï¼æµå¼ IOã å½ç¨åºä»ç¡¬çå¾å åè¯»åæ°æ®çæ¶åï¼æä½ç³»ç»ä½¿ç¨äº 2 个âå°ä¼ä¿©âæ¥æé«æ§è½ï¼é£å°±æ¯é¢è¯»ï¼å¦ææè¯»åäºç¬¬ä¸æåºç第ä¸ç£éçå 容ï¼é£ä¹ä½ 徿å¯è½ä¹ä¼ä½¿ç¨ç¬¬äºç£éå第åç£éçå å®¹ï¼æä»¥æä½ç³»ç»ä¼æéè¿ç£éçå 容æå读ååºæ¥ï¼æ¾å¨å åä¸ï¼å³ç¼åã ï¼PSï¼ä»¥ä¸è¿ç¨ç®åäºï¼ éè¿ä¸é¢å¯ä»¥çå°ï¼æä½ç³»ç»æ¯æå Blockä»ç¡¬çæ¿æ°æ®ï¼å°±å¦åä¸ä¸ªå¤§è¸çï¼ä¸ä¸åå°±æ¾å ¥äºä¸çæ°´ã使¯ï¼å½ Java 使ç¨çæ¶åï¼æ§ç IO ç¡®å®åºäº æµ Streamçï¼ä¹å°±æ¯è½ç¶æä½ç³»ç»ç»æäºä¸è¸çæ°´ï¼ä½æ¯æå¾ç¨å¸ç®¡æ ¢æ ¢åã äºæ¯ï¼NIO 横空åºä¸ã ### æ»ç» Javaä¸çIO/NIOï¼å¤è·¯å¤ç¨ IO 模å 1ãå¤è·¯å¤ç¨ IO æ¨¡åæ¯ç®å使ç¨å¾æ¯è¾å¤ç模åãJava NIO å®é ä¸å°±æ¯å¤è·¯å¤ç¨ IOãå¨å¤è·¯å¤ç¨ IO 模åä¸ï¼ä¼æä¸ä¸ªçº¿ç¨ä¸æå»è½®è¯¢å¤ä¸ª socket çç¶æï¼åªæå½ socket çæ£æè¯»åäºä»¶æ¶ï¼æçæ£è°ç¨å®é ç IO 读åæä½ãå 为å¨å¤è·¯å¤ç¨ IO 模åä¸ï¼åªéè¦ä½¿ç¨ä¸ä¸ªçº¿ç¨å°±å¯ä»¥ç®¡çå¤ä¸ªsocketï¼ç³»ç»ä¸éè¦å»ºç«æ°çè¿ç¨æè 线ç¨ï¼ä¹ä¸å¿ ç»´æ¤è¿äºçº¿ç¨åè¿ç¨ï¼å¹¶ä¸åªæå¨çæ£æ socket 读åäºä»¶è¿è¡æ¶ï¼æä¼ä½¿ç¨ IO èµæºï¼æä»¥å®å¤§å¤§åå°äºèµæºå ç¨ãå¨ Java NIO ä¸ï¼æ¯éè¿ selector.select()廿¥è¯¢æ¯ä¸ªé鿝妿å°è¾¾äºä»¶ï¼å¦ææ²¡æäºä»¶ï¼åä¸ç´é»å¡å¨é£éï¼å æ¤è¿ç§æ¹å¼ä¼å¯¼è´ç¨æ·çº¿ç¨çé»å¡ãå¤è·¯å¤ç¨ IO 模å¼ï¼éè¿ä¸ä¸ªçº¿ç¨å°±å¯ä»¥ç®¡çå¤ä¸ª socketï¼åªæå½ socket çæ£æè¯»åäºä»¶åçæä¼å ç¨èµæºæ¥è¿è¡å®é ç读åæä½ãå æ¤ï¼å¤è·¯å¤ç¨ IO æ¯è¾éåè¿æ¥æ°æ¯è¾å¤çæ åµã 2ãå¦å¤å¤è·¯å¤ç¨ IO ä¸ºä½æ¯éé»å¡ IO 模åçæç髿¯å 为å¨éé»å¡ IO ä¸ï¼ä¸æå°è¯¢é® socket ç¶ææ¶éè¿ç¨æ·çº¿ç¨å»è¿è¡çï¼èå¨å¤è·¯å¤ç¨ IO ä¸ï¼è½®è¯¢æ¯ä¸ª socket ç¶ææ¯å æ ¸å¨è¿è¡çï¼è¿ä¸ªæçè¦æ¯ç¨æ·çº¿ç¨è¦é«çå¤ã 3ãä¸è¿è¦æ³¨æçæ¯ï¼å¤è·¯å¤ç¨ IO æ¨¡åæ¯éè¿è½®è¯¢çæ¹å¼æ¥æ£æµæ¯å¦æäºä»¶å°è¾¾ï¼å¹¶ä¸å¯¹å°è¾¾çäºä»¶éä¸è¿è¡ååºãå æ¤å¯¹äºå¤è·¯å¤ç¨ IO æ¨¡åæ¥è¯´ï¼ ä¸æ¦äºä»¶ååºä½å¾å¤§ï¼é£ä¹å°±ä¼å¯¼è´åç»çäºä»¶è¿è¿å¾ä¸å°å¤çï¼å¹¶ä¸ä¼å½±åæ°çäºä»¶è½®è¯¢ã I/Oå¤ç¨æ¯å¤è·¯å¤ç¨ï¼è¿éçå¤è·¯æ¯æNä¸ªè¿æ¥ï¼æ¯ä¸ä¸ªè¿æ¥å¯¹åºä¸ä¸ªchannelï¼æè 说å¤è·¯å°±æ¯å¤ä¸ªchannelãå¤ç¨ï¼æ¯æå¤ä¸ªè¿æ¥å¤ç¨äºä¸ä¸ªçº¿ç¨æè å°é线ç¨(å¨Tomcat䏿¯Math.min(2,Runtime.getRuntime().availableProcessors()))ã # Reference * [Java IO详解](https://www.jianshu.com/p/aea76bc0e6d1) * [æ·±å ¥çè§£Javaä¸çIO](https://www.cnblogs.com/ylspace/p/8128112.html) * [Java IOä¸IOçåºå«åæ¯è¾](https://blog.51cto.com/825272560/2059144)