--- title: Java IO 模å详解 category: Java tag: - Java IO - Javaåºç¡ --- IO 模åè¿åç¡®å®æºé¾çè§£çï¼éè¦å¤ªå¤è®¡ç®æºåºå±ç¥è¯ãåè¿ç¯æç« ç¨äºæºä¹ ï¼å°±éå¸¸å¸æè½æææç¥éçè®²åºæ¥å§!叿æåä»¬è½ææ¶è·ï¼ä¸ºäºåè¿ç¯æç« ï¼è¿ç¿»çäºä¸ä¸ãUNIX ç½ç»ç¼ç¨ãè¿æ¬ä¹¦ï¼å¤ªé¾äºï¼ææ»´ä¹ä¹ï¼å¿ç~ _个人è½åæéã妿æç« æä»»ä½éè¦è¡¥å /å®å/ä¿®æ¹çå°æ¹ï¼æ¬¢è¿å¨è¯è®ºåºæåºï¼å ±åè¿æ¥ï¼_ ## åè¨ I/O ä¸ç´æ¯å¾å¤å°ä¼ä¼´é¾ä»¥çè§£çä¸ä¸ªç¥è¯ç¹ï¼è¿ç¯æç« æä¼å°ææçè§£ç I/O 讲ç»ä½ å¬ï¼å¸æå¯ä»¥å¯¹ä½ ææå¸®å©ã ## I/O ### ä½ä¸º I/O? I/Oï¼**I**nput/**O**utpuï¼ å³**è¾å ¥ï¼è¾åº** ã **æä»¬å ä»è®¡ç®æºç»æçè§åº¦æ¥è§£è¯»ä¸ä¸ I/Oã** æ ¹æ®å¯.è¯ºä¾æ¼ç»æï¼è®¡ç®æºç»æå为 5 大é¨åï¼è¿ç®å¨ãæ§å¶å¨ãåå¨å¨ãè¾å ¥è®¾å¤ãè¾åºè®¾å¤ã  è¾å ¥è®¾å¤ï¼æ¯å¦é®çï¼åè¾åºè®¾å¤ï¼æ¯å¦æ¾ç¤ºå¨ï¼é½å±äºå¤é¨è®¾å¤ãç½å¡ã硬çè¿ç§æ¢å¯ä»¥å±äºè¾å ¥è®¾å¤ï¼ä¹å¯ä»¥å±äºè¾åºè®¾å¤ã è¾å ¥è®¾å¤åè®¡ç®æºè¾å ¥æ°æ®ï¼è¾åºè®¾å¤æ¥æ¶è®¡ç®æºè¾åºçæ°æ®ã **ä»è®¡ç®æºç»æçè§è§æ¥ççè¯ï¼ I/O æè¿°äºè®¡ç®æºç³»ç»ä¸å¤é¨è®¾å¤ä¹é´éä¿¡çè¿ç¨ã** **æä»¬åå ä»åºç¨ç¨åºçè§åº¦æ¥è§£è¯»ä¸ä¸ I/Oã** æ ¹æ®å¤§å¦éå¦å°çæä½ç³»ç»ç¸å ³çç¥è¯ï¼ä¸ºäºä¿è¯æä½ç³»ç»çç¨³å®æ§åå®å ¨æ§ï¼ä¸ä¸ªè¿ç¨çå°å空é´åå为 **ç¨æ·ç©ºé´ï¼User spaceï¼** å **å æ ¸ç©ºé´ï¼Kernel space ï¼** ã åæä»¬å¹³å¸¸è¿è¡çåºç¨ç¨åºé½æ¯è¿è¡å¨ç¨æ·ç©ºé´ï¼åªæå æ ¸ç©ºé´æè½è¿è¡ç³»ç»æçº§å«çèµæºæå ³çæä½ï¼æ¯å¦æä»¶ç®¡çãè¿ç¨éä¿¡ãå å管çççãä¹å°±æ¯è¯´ï¼æä»¬æ³è¦è¿è¡ IO æä½ï¼ä¸å®æ¯è¦ä¾èµå æ ¸ç©ºé´çè½åã å¹¶ä¸ï¼ç¨æ·ç©ºé´çç¨åºä¸è½ç´æ¥è®¿é®å æ ¸ç©ºé´ã 彿³è¦æ§è¡ IO æä½æ¶ï¼ç±äºæ²¡ææ§è¡è¿äºæä½çæéï¼åªè½åèµ·ç³»ç»è°ç¨è¯·æ±æä½ç³»ç»å¸®å¿å®æã å æ¤ï¼ç¨æ·è¿ç¨æ³è¦æ§è¡ IO æä½çè¯ï¼å¿ é¡»éè¿ **ç³»ç»è°ç¨** æ¥é´æ¥è®¿é®å æ ¸ç©ºé´ æä»¬å¨å¹³å¸¸å¼åè¿ç¨ä¸æ¥è§¦æå¤çå°±æ¯ **ç£ç IOï¼è¯»åæä»¶ï¼** å **ç½ç» IOï¼ç½ç»è¯·æ±åååºï¼**ã **ä»åºç¨ç¨åºçè§è§æ¥ççè¯ï¼æä»¬çåºç¨ç¨åºå¯¹æä½ç³»ç»çå æ ¸åèµ· IO è°ç¨ï¼ç³»ç»è°ç¨ï¼ï¼æä½ç³»ç»è´è´£çå æ ¸æ§è¡å ·ä½ç IO æä½ãä¹å°±æ¯è¯´ï¼æä»¬çåºç¨ç¨åºå®é ä¸åªæ¯åèµ·äº IO æä½çè°ç¨èå·²ï¼å ·ä½ IO çæ§è¡æ¯ç±æä½ç³»ç»çå æ ¸æ¥å®æçã** å½åºç¨ç¨åºåèµ· I/O è°ç¨åï¼ä¼ç»å两个æ¥éª¤ï¼ 1. å æ ¸çå¾ I/O 设å¤åå¤å¥½æ°æ® 2. å æ ¸å°æ°æ®ä»å æ ¸ç©ºé´æ·è´å°ç¨æ·ç©ºé´ã ### æåªäºå¸¸è§ç IO 模å? UNIX ç³»ç»ä¸ï¼ IO 模åä¸å ±æ 5 ç§ï¼**忥é»å¡ I/O**ã**忥éé»å¡ I/O**ã**I/O å¤è·¯å¤ç¨**ã**ä¿¡å·é©±å¨ I/O** å**弿¥ I/O**ã è¿ä¹æ¯æä»¬ç»å¸¸æå°ç 5 ç§ IO 模åã ## Java ä¸ 3 ç§å¸¸è§ IO 模å ### BIO (Blocking I/O) **BIO å±äºåæ¥é»å¡ IO 模å** ã 忥é»å¡ IO 模åä¸ï¼åºç¨ç¨åºåèµ· read è°ç¨åï¼ä¼ä¸ç´é»å¡ï¼ç´å°å æ ¸ææ°æ®æ·è´å°ç¨æ·ç©ºé´ã  å¨å®¢æ·ç«¯è¿æ¥æ°éä¸é«çæ åµä¸ï¼æ¯æ²¡é®é¢çã使¯ï¼å½é¢å¯¹åä¸çè³ç¾ä¸çº§è¿æ¥çæ¶åï¼ä¼ ç»ç BIO æ¨¡åæ¯æ è½ä¸ºåçãå æ¤ï¼æä»¬éè¦ä¸ç§æ´é«æç I/O å¤çæ¨¡åæ¥åºå¯¹æ´é«çå¹¶åéã ### NIO (Non-blocking/New I/O) Java ä¸ç NIO äº Java 1.4 ä¸å¼å ¥ï¼å¯¹åº `java.nio` å ï¼æä¾äº `Channel` , `Selector`ï¼`Buffer` çæ½è±¡ãNIO ä¸ç N å¯ä»¥ç解为 Non-blockingï¼ä¸åçº¯æ¯ Newã宿¯æ¯æé¢åç¼å²çï¼åºäºééç I/O æä½æ¹æ³ã 对äºé«è´è½½ãé«å¹¶åçï¼ç½ç»ï¼åºç¨ï¼åºä½¿ç¨ NIO ã Java ä¸ç NIO å¯ä»¥ç使¯ **I/O å¤è·¯å¤ç¨æ¨¡å**ã乿å¾å¤äººè®¤ä¸ºï¼Java ä¸ç NIO å±äºåæ¥éé»å¡ IO 模åã è·çæçæè·¯å¾ä¸ççï¼ç¸ä¿¡ä½ ä¼å¾å°çæ¡ï¼ æä»¬å æ¥çç **忥éé»å¡ IO 模å**ã  忥éé»å¡ IO 模åä¸ï¼åºç¨ç¨åºä¼ä¸ç´åèµ· read è°ç¨ï¼çå¾ æ°æ®ä»å æ ¸ç©ºé´æ·è´å°ç¨æ·ç©ºé´çè¿æ®µæ¶é´éï¼çº¿ç¨ä¾ç¶æ¯é»å¡çï¼ç´å°å¨å æ ¸ææ°æ®æ·è´å°ç¨æ·ç©ºé´ã ç¸æ¯äºåæ¥é»å¡ IO 模åï¼åæ¥éé»å¡ IO 模åç¡®å®æäºå¾å¤§æ¹è¿ãéè¿è½®è¯¢æä½ï¼é¿å äºä¸ç´é»å¡ã 使¯ï¼è¿ç§ IO 模ååæ ·åå¨é®é¢ï¼**åºç¨ç¨åºä¸æè¿è¡ I/O ç³»ç»è°ç¨è½®è¯¢æ°æ®æ¯å¦å·²ç»åå¤å¥½çè¿ç¨æ¯ååæ¶è CPU èµæºçã** è¿ä¸ªæ¶åï¼**I/O å¤è·¯å¤ç¨æ¨¡å** å°±ä¸åºäºã  IO å¤è·¯å¤ç¨æ¨¡åä¸ï¼çº¿ç¨é¦å åèµ· select è°ç¨ï¼è¯¢é®å æ ¸æ°æ®æ¯å¦åå¤å°±ç»ªï¼çå æ ¸ææ°æ®åå¤å¥½äºï¼ç¨æ·çº¿ç¨ååèµ· read è°ç¨ãread è°ç¨çè¿ç¨ï¼æ°æ®ä»å æ ¸ç©ºé´ -> ç¨æ·ç©ºé´ï¼è¿æ¯é»å¡çã > ç®åæ¯æ IO å¤è·¯å¤ç¨çç³»ç»è°ç¨ï¼æ selectï¼epoll ççãselect ç³»ç»è°ç¨ï¼ç®åå ä¹å¨ææçæä½ç³»ç»ä¸é½ææ¯æã > > - **select è°ç¨**ï¼å æ ¸æä¾çç³»ç»è°ç¨ï¼å®æ¯æä¸æ¬¡æ¥è¯¢å¤ä¸ªç³»ç»è°ç¨çå¯ç¨ç¶æãå 乿æçæä½ç³»ç»é½æ¯æã > - **epoll è°ç¨**ï¼linux 2.6 å æ ¸ï¼å±äº select è°ç¨çå¢å¼ºçæ¬ï¼ä¼åäº IO çæ§è¡æçã **IO å¤è·¯å¤ç¨æ¨¡åï¼éè¿åå°æ æçç³»ç»è°ç¨ï¼åå°äºå¯¹ CPU èµæºçæ¶èã** Java ä¸ç NIO ï¼æä¸ä¸ªé常éè¦ç**éæ©å¨ ( Selector )** çæ¦å¿µï¼ä¹å¯ä»¥è¢«ç§°ä¸º **å¤è·¯å¤ç¨å¨**ãéè¿å®ï¼åªéè¦ä¸ä¸ªçº¿ç¨ä¾¿å¯ä»¥ç®¡çå¤ä¸ªå®¢æ·ç«¯è¿æ¥ãå½å®¢æ·ç«¯æ°æ®å°äºä¹åï¼æä¼ä¸ºå ¶æå¡ã  ### AIO (Asynchronous I/O) AIO ä¹å°±æ¯ NIO 2ãJava 7 ä¸å¼å ¥äº NIO çæ¹è¿ç NIO 2,宿¯å¼æ¥ IO 模åã 弿¥ IO æ¯åºäºäºä»¶ååè°æºå¶å®ç°çï¼ä¹å°±æ¯åºç¨æä½ä¹åä¼ç´æ¥è¿åï¼ä¸ä¼å µå¡å¨é£éï¼å½åå°å¤çå®æï¼æä½ç³»ç»ä¼éç¥ç¸åºç线ç¨è¿è¡åç»çæä½ã  ç®åæ¥è¯´ AIO çåºç¨è¿ä¸æ¯å¾å¹¿æ³ãNetty ä¹åä¹å°è¯ä½¿ç¨è¿ AIOï¼ä¸è¿åæ¾å¼äºãè¿æ¯å 为ï¼Netty 使ç¨äº AIO ä¹åï¼å¨ Linux ç³»ç»ä¸çæ§è½å¹¶æ²¡æå¤å°æåã æåï¼æ¥ä¸å¼ å¾ï¼ç®åæ»ç»ä¸ä¸ Java ä¸ç BIOãNIOãAIOã  ## åè - ãæ·±å ¥æè§£ Tomcat & Jettyã - å¦ä½å®æä¸æ¬¡ IOï¼https://llc687.top/126.html - ç¨åºååºè¯¥è¿æ ·çè§£ IOï¼[https://www.jianshu.com/p/fa7bdc4f3de7](https://www.jianshu.com/p/fa7bdc4f3de7) - 10 åéçæï¼ Java NIO åºå±åçï¼https://www.cnblogs.com/crazymakercircle/p/10225159.html - IO 模åç¥å¤å° | ç论ç¯ï¼https://www.cnblogs.com/sheng-jie/p/how-much-you-know-about-io-models.html - ãUNIX ç½ç»ç¼ç¨ å· 1ï¼å¥æ¥åèç½ API ã6.2 è IO 模å