·þÎñÆ÷¶Ë±à³Ì¾³£ÐèÒª¹¹Ôì¸ßÐÔÄܵÄIOÄ£ÐÍ£¬³£¼ûµÄIOÄ£ÐÍÓÐËÄÖÖ£º
£¨1£©Í¬²½×èÈûIO£¨Blocking IO£©£º¼´´«Í³µÄIOÄ£ÐÍ¡£
£¨2£©Í¬²½·Ç×èÈûIO£¨Non-blocking IO£©£ºÄ¬ÈÏ´´½¨µÄsocket¶¼ÊÇ×èÈûµÄ£¬·Ç×èÈûIOÒªÇósocket±»ÉèÖÃΪNONBLOCK¡£×¢ÒâÕâÀïËù˵µÄNIO²¢·ÇJavaµÄNIO£¨New
IO£©¿â¡£
£¨3£©IO¶à·¸´Óã¨IO Multiplexing£©£º¼´¾µäµÄReactorÉè¼ÆÄ£Ê½£¬ÓÐʱҲ³ÆÎªÒì²½×èÈûIO£¬JavaÖеÄSelectorºÍLinuxÖеÄepoll¶¼ÊÇÕâÖÖÄ£ÐÍ¡£
£¨4£©Òì²½IO£¨Asynchronous IO£©£º¼´¾µäµÄProactorÉè¼ÆÄ£Ê½£¬Ò²³ÆÎªÒì²½·Ç×èÈûIO¡£
ͬ²½ºÍÒì²½µÄ¸ÅÄîÃèÊöµÄÊÇÓû§Ïß³ÌÓëÄں˵Ľ»»¥·½Ê½£ºÍ¬²½ÊÇÖ¸Óû§Ï̷߳¢ÆðIOÇëÇóºóÐèÒªµÈ´ý»òÕßÂÖѯÄÚºËIO²Ù×÷Íê³Éºó²ÅÄܼÌÐøÖ´ÐУ»¶øÒì²½ÊÇÖ¸Óû§Ï̷߳¢ÆðIOÇëÇóºóÈÔ¼ÌÐøÖ´ÐУ¬µ±ÄÚºËIO²Ù×÷Íê³Éºó»á֪ͨÓû§Ị̈߳¬»òÕßµ÷ÓÃÓû§Ïß³Ì×¢²áµÄ»Øµ÷º¯Êý¡£
×èÈûºÍ·Ç×èÈûµÄ¸ÅÄîÃèÊöµÄÊÇÓû§Ï̵߳÷ÓÃÄÚºËIO²Ù×÷µÄ·½Ê½£º×èÈûÊÇÖ¸IO²Ù×÷ÐèÒª³¹µ×Íê³Éºó²Å·µ»Øµ½Óû§¿Õ¼ä£»¶ø·Ç×èÈûÊÇÖ¸IO²Ù×÷±»µ÷ÓúóÁ¢¼´·µ»Ø¸øÓû§Ò»¸ö״ֵ̬£¬ÎÞÐèµÈµ½IO²Ù×÷³¹µ×Íê³É¡£
ÁíÍ⣬Richard Stevens ÔÚ¡¶Unix ÍøÂç±à³Ì¡·¾í1ÖÐÌáµ½µÄ»ùÓÚÐźÅÇý¶¯µÄIO£¨Signal
Driven IO£©Ä£ÐÍ£¬ÓÉÓÚ¸ÃÄ£ÐͲ¢²»³£Ó㬱¾ÎIJ»×÷Éæ¼°¡£½ÓÏÂÀ´£¬ÎÒÃÇÏêϸ·ÖÎöËÄÖÖ³£¼ûµÄIOÄ£Ð͵ÄʵÏÖÔÀí¡£ÎªÁË·½±ãÃèÊö£¬ÎÒÃÇͳһʹÓÃIOµÄ¶Á²Ù×÷×÷ΪʾÀý¡£
Ò»¡¢Í¬²½×èÈûIO
ͬ²½×èÈûIOÄ£ÐÍÊÇ×î¼òµ¥µÄIOÄ£ÐÍ£¬Óû§Ïß³ÌÔÚÄں˽øÐÐIO²Ù×÷ʱ±»×èÈû¡£

ͼ1 ͬ²½×èÈûIO
Èçͼ1Ëùʾ£¬Óû§Ïß³Ìͨ¹ýϵͳµ÷ÓÃread·¢ÆðIO¶Á²Ù×÷£¬ÓÉÓû§¿Õ¼äתµ½Äں˿ռ䡣Äں˵ȵ½Êý¾Ý°üµ½´ïºó£¬È»ºó½«½ÓÊÕµÄÊý¾Ý¿½±´µ½Óû§¿Õ¼ä£¬Íê³Éread²Ù×÷¡£
Óû§Ïß³ÌʹÓÃͬ²½×èÈûIOÄ£Ð͵Äα´úÂëÃèÊöΪ£º
{ read(socket, buffer); process(buffer); } |
¼´Óû§ÐèÒªµÈ´ýread½«socketÖеÄÊý¾Ý¶ÁÈ¡µ½bufferºó£¬²Å¼ÌÐø´¦Àí½ÓÊÕµÄÊý¾Ý¡£Õû¸öIOÇëÇóµÄ¹ý³ÌÖУ¬Óû§Ïß³ÌÊDZ»×èÈûµÄ£¬Õâµ¼ÖÂÓû§ÔÚ·¢ÆðIOÇëÇóʱ£¬²»ÄÜ×öÈκÎÊÂÇ飬¶ÔCPUµÄ×ÊÔ´ÀûÓÃÂʲ»¹»¡£
¶þ¡¢Í¬²½·Ç×èÈûIO
ͬ²½·Ç×èÈûIOÊÇÔÚͬ²½×èÈûIOµÄ»ù´¡ÉÏ£¬½«socketÉèÖÃΪNONBLOCK¡£ÕâÑù×öÓû§Ï߳̿ÉÒÔÔÚ·¢ÆðIOÇëÇóºó¿ÉÒÔÁ¢¼´·µ»Ø¡£

ͼ2 ͬ²½·Ç×èÈûIO
Èçͼ2Ëùʾ£¬ÓÉÓÚsocketÊÇ·Ç×èÈûµÄ·½Ê½£¬Òò´ËÓû§Ï̷߳¢ÆðIOÇëÇóʱÁ¢¼´·µ»Ø¡£µ«²¢Î´¶ÁÈ¡µ½ÈκÎÊý¾Ý£¬Óû§Ïß³ÌÐèÒª²»¶ÏµØ·¢ÆðIOÇëÇó£¬Ö±µ½Êý¾Ýµ½´ïºó£¬²ÅÕæÕý¶ÁÈ¡µ½Êý¾Ý£¬¼ÌÐøÖ´ÐС£
Óû§Ïß³ÌʹÓÃͬ²½·Ç×èÈûIOÄ£Ð͵Äα´úÂëÃèÊöΪ£º
{ while(read(socket, buffer) != SUCCESS) ; process(buffer); } |
¼´Óû§ÐèÒª²»¶ÏµØµ÷ÓÃread£¬³¢ÊÔ¶ÁÈ¡socketÖеÄÊý¾Ý£¬Ö±µ½¶ÁÈ¡³É¹¦ºó£¬²Å¼ÌÐø´¦Àí½ÓÊÕµÄÊý¾Ý¡£Õû¸öIOÇëÇóµÄ¹ý³ÌÖУ¬ËäÈ»Óû§Ïß³Ìÿ´Î·¢ÆðIOÇëÇóºó¿ÉÒÔÁ¢¼´·µ»Ø£¬µ«ÊÇΪÁ˵ȵ½Êý¾Ý£¬ÈÔÐèÒª²»¶ÏµØÂÖѯ¡¢Öظ´ÇëÇó£¬ÏûºÄÁË´óÁ¿µÄCPUµÄ×ÊÔ´¡£Ò»°ãºÜÉÙÖ±½ÓʹÓÃÕâÖÖÄ£ÐÍ£¬¶øÊÇÔÚÆäËûIOÄ£ÐÍÖÐʹÓ÷Ç×èÈûIOÕâÒ»ÌØÐÔ¡£
Èý¡¢IO¶à·¸´ÓÃ
IO¶à·¸´ÓÃÄ£ÐÍÊǽ¨Á¢ÔÚÄÚºËÌṩµÄ¶à··ÖÀ뺯Êýselect»ù´¡Ö®Éϵģ¬Ê¹ÓÃselectº¯Êý¿ÉÒÔ±ÜÃâͬ²½·Ç×èÈûIOÄ£ÐÍÖÐÂÖѯµÈ´ýµÄÎÊÌâ¡£

ͼ3 ¶à··ÖÀ뺯Êýselect
Èçͼ3Ëùʾ£¬Óû§Ê×ÏȽ«ÐèÒª½øÐÐIO²Ù×÷µÄsocketÌí¼Óµ½selectÖУ¬È»ºó×èÈûµÈ´ýselectϵͳµ÷Ó÷µ»Ø¡£µ±Êý¾Ýµ½´ïʱ£¬socket±»¼¤»î£¬selectº¯Êý·µ»Ø¡£Óû§Ïß³ÌÕýʽ·¢ÆðreadÇëÇ󣬶ÁÈ¡Êý¾Ý²¢¼ÌÐøÖ´ÐС£
´ÓÁ÷³ÌÉÏÀ´¿´£¬Ê¹ÓÃselectº¯Êý½øÐÐIOÇëÇóºÍͬ²½×èÈûÄ£ÐÍûÓÐÌ«´óµÄÇø±ð£¬ÉõÖÁ»¹¶àÁËÌí¼Ó¼àÊÓsocket£¬ÒÔ¼°µ÷ÓÃselectº¯ÊýµÄ¶îÍâ²Ù×÷£¬Ð§Âʸü²î¡£µ«ÊÇ£¬Ê¹ÓÃselectÒÔºó×î´óµÄÓÅÊÆÊÇÓû§¿ÉÒÔÔÚÒ»¸öÏß³ÌÄÚͬʱ´¦Àí¶à¸ösocketµÄIOÇëÇó¡£Óû§¿ÉÒÔ×¢²á¶à¸ösocket£¬È»ºó²»¶ÏµØµ÷ÓÃselect¶ÁÈ¡±»¼¤»îµÄsocket£¬¼´¿É´ïµ½ÔÚͬһ¸öÏß³ÌÄÚͬʱ´¦Àí¶à¸öIOÇëÇóµÄÄ¿µÄ¡£¶øÔÚͬ²½×èÈûÄ£ÐÍÖУ¬±ØÐëͨ¹ý¶àÏ̵߳ķ½Ê½²ÅÄÜ´ïµ½Õâ¸öÄ¿µÄ¡£
Óû§Ïß³ÌʹÓÃselectº¯ÊýµÄα´úÂëÃèÊöΪ£º
{ select(socket); while(1) { sockets = select(); for(socket in sockets) { if(can_read(socket)) { read(socket, buffer); process(buffer); } } } } |
ÆäÖÐwhileÑ»·Ç°½«socketÌí¼Óµ½select¼àÊÓÖУ¬È»ºóÔÚwhileÄÚÒ»Ö±µ÷ÓÃselect»ñÈ¡±»¼¤»îµÄsocket£¬Ò»µ©socket¿É¶Á£¬±ãµ÷ÓÃreadº¯Êý½«socketÖеÄÊý¾Ý¶ÁÈ¡³öÀ´¡£
È»¶ø£¬Ê¹ÓÃselectº¯ÊýµÄÓŵ㲢²»½öÏÞÓÚ´Ë¡£ËäÈ»ÉÏÊö·½Ê½ÔÊÐíµ¥Ïß³ÌÄÚ´¦Àí¶à¸öIOÇëÇ󣬵«ÊÇÿ¸öIOÇëÇóµÄ¹ý³Ì»¹ÊÇ×èÈûµÄ£¨ÔÚselectº¯ÊýÉÏ×èÈû£©£¬Æ½¾ùʱ¼äÉõÖÁ±Èͬ²½×èÈûIOÄ£ÐÍ»¹Òª³¤¡£Èç¹ûÓû§Ïß³ÌÖ»×¢²á×Ô¼º¸ÐÐËȤµÄsocket»òÕßIOÇëÇó£¬È»ºóÈ¥×ö×Ô¼ºµÄÊÂÇ飬µÈµ½Êý¾Ýµ½À´Ê±ÔÙ½øÐд¦Àí£¬Ôò¿ÉÒÔÌá¸ßCPUµÄÀûÓÃÂÊ¡£
IO¶à·¸´ÓÃÄ£ÐÍʹÓÃÁËReactorÉè¼ÆÄ£Ê½ÊµÏÖÁËÕâÒ»»úÖÆ¡£

ͼ4 ReactorÉè¼ÆÄ£Ê½
Èçͼ4Ëùʾ£¬EventHandler³éÏóÀà±íʾIOʼþ´¦ÀíÆ÷£¬ËüÓµÓÐIOÎļþ¾ä±úHandle£¨Í¨¹ýget_handle»ñÈ¡£©£¬ÒÔ¼°¶ÔHandleµÄ²Ù×÷handle_event£¨¶Á/дµÈ£©¡£¼Ì³ÐÓÚEventHandlerµÄ×ÓÀà¿ÉÒÔ¶Ôʼþ´¦ÀíÆ÷µÄÐÐΪ½øÐж¨ÖÆ¡£ReactorÀàÓÃÓÚ¹ÜÀíEventHandler£¨×¢²á¡¢É¾³ýµÈ£©£¬²¢Ê¹ÓÃhandle_eventsʵÏÖʼþÑ»·£¬²»¶Ïµ÷ÓÃͬ²½Ê¼þ¶à··ÖÀëÆ÷£¨Ò»°ãÊÇÄںˣ©µÄ¶à··ÖÀ뺯Êýselect£¬Ö»ÒªÄ³¸öÎļþ¾ä±ú±»¼¤»î£¨¿É¶Á/дµÈ£©£¬select¾Í·µ»Ø£¨×èÈû£©£¬handle_events¾Í»áµ÷ÓÃÓëÎļþ¾ä±ú¹ØÁªµÄʼþ´¦ÀíÆ÷µÄhandle_event½øÐÐÏà¹Ø²Ù×÷¡£

ͼ5 IO¶à·¸´ÓÃ
Èçͼ5Ëùʾ£¬Í¨¹ýReactorµÄ·½Ê½£¬¿ÉÒÔ½«Óû§Ïß³ÌÂÖѯIO²Ù×÷״̬µÄ¹¤×÷ͳһ½»¸øhandle_eventsʼþÑ»·½øÐд¦Àí¡£Óû§Ïß³Ì×¢²áʼþ´¦ÀíÆ÷Ö®ºó¿ÉÒÔ¼ÌÐøÖ´ÐÐ×öÆäËûµÄ¹¤×÷£¨Òì²½£©£¬¶øReactorÏ̸߳ºÔðµ÷ÓÃÄں˵Äselectº¯Êý¼ì²ésocket״̬¡£µ±ÓÐsocket±»¼¤»îʱ£¬Ôò֪ͨÏàÓ¦µÄÓû§Ị̈߳¨»òÖ´ÐÐÓû§Ï̵߳Ļص÷º¯Êý£©£¬Ö´ÐÐhandle_event½øÐÐÊý¾Ý¶ÁÈ¡¡¢´¦ÀíµÄ¹¤×÷¡£ÓÉÓÚselectº¯ÊýÊÇ×èÈûµÄ£¬Òò´Ë¶à·IO¸´ÓÃÄ£ÐÍÒ²±»³ÆÎªÒì²½×èÈûIOÄ£ÐÍ¡£×¢Ò⣬ÕâÀïµÄËù˵µÄ×èÈûÊÇÖ¸selectº¯ÊýÖ´ÐÐʱÏ̱߳»×èÈû£¬¶ø²»ÊÇÖ¸socket¡£Ò»°ãÔÚʹÓÃIO¶à·¸´ÓÃÄ£ÐÍʱ£¬socket¶¼ÊÇÉèÖÃΪNONBLOCKµÄ£¬²»¹ýÕâ²¢²»»á²úÉúÓ°Ï죬ÒòΪÓû§·¢ÆðIOÇëÇóʱ£¬Êý¾ÝÒѾµ½´ïÁË£¬Óû§Ïß³ÌÒ»¶¨²»»á±»×èÈû¡£
Óû§Ïß³ÌʹÓÃIO¶à·¸´ÓÃÄ£Ð͵Äα´úÂëÃèÊöΪ£º
void UserEventHandler::handle_event() { if(can_read(socket)) { read(socket, buffer); process(buffer); } }
{ Reactor.register(new UserEventHandler(socket)); }
|
Óû§ÐèÒªÖØÐ´EventHandlerµÄhandle_eventº¯Êý½øÐжÁÈ¡Êý¾Ý¡¢´¦ÀíÊý¾ÝµÄ¹¤×÷£¬Óû§Ïß³ÌÖ»ÐèÒª½«×Ô¼ºµÄEventHandler×¢²áµ½Reactor¼´¿É¡£ReactorÖÐhandle_eventsʼþÑ»·µÄα´úÂë´óÖÂÈçÏ¡£
Reactor::handle_events() { while(1) { sockets = select(); for(socket in sockets) { get_event_handler(socket).handle_event(); } } } |
ʼþÑ»·²»¶ÏµØµ÷ÓÃselect»ñÈ¡±»¼¤»îµÄsocket£¬È»ºó¸ù¾Ý»ñÈ¡socket¶ÔÓ¦µÄEventHandler£¬Ö´ÐÐÆ÷handle_eventº¯Êý¼´¿É¡£
IO¶à·¸´ÓÃÊÇ×ʹÓõÄIOÄ£ÐÍ£¬µ«ÊÇÆäÒì²½³Ì¶È»¹²»¹»¡°³¹µ×¡±£¬ÒòΪËüʹÓÃÁË»á×èÈûÏ̵߳Äselectϵͳµ÷Óá£Òò´ËIO¶à·¸´ÓÃÖ»ÄܳÆÎªÒì²½×èÈûIO£¬¶ø·ÇÕæÕýµÄÒì²½IO¡£
ËÄ¡¢Òì²½IO
¡°ÕæÕý¡±µÄÒì²½IOÐèÒª²Ù×÷ϵͳ¸üÇ¿µÄÖ§³Ö¡£ÔÚIO¶à·¸´ÓÃÄ£ÐÍÖУ¬Ê¼þÑ»·½«Îļþ¾ä±úµÄ״̬ʼþ֪ͨ¸øÓû§Ị̈߳¬ÓÉÓû§Ïß³Ì×ÔÐжÁÈ¡Êý¾Ý¡¢´¦ÀíÊý¾Ý¡£¶øÔÚÒì²½IOÄ£ÐÍÖУ¬µ±Óû§Ïß³ÌÊÕµ½Í¨ÖªÊ±£¬Êý¾ÝÒѾ±»Äں˶ÁÈ¡Íê±Ï£¬²¢·ÅÔÚÁËÓû§Ïß³ÌÖ¸¶¨µÄ»º³åÇøÄÚ£¬ÄÚºËÔÚIOÍê³Éºó֪ͨÓû§Ïß³ÌÖ±½ÓʹÓü´¿É¡£
Òì²½IOÄ£ÐÍʹÓÃÁËProactorÉè¼ÆÄ£Ê½ÊµÏÖÁËÕâÒ»»úÖÆ¡£

ͼ6 ProactorÉè¼ÆÄ£Ê½
Èçͼ6£¬ProactorģʽºÍReactorģʽÔڽṹÉϱȽÏÏàËÆ£¬²»¹ýÔÚÓû§£¨Client£©Ê¹Ó÷½Ê½Éϲî±ð½Ï´ó¡£ReactorģʽÖУ¬Óû§Ïß³Ìͨ¹ýÏòReactor¶ÔÏó×¢²á¸ÐÐËȤµÄʼþ¼àÌý£¬È»ºóʼþ´¥·¢Ê±µ÷ÓÃʼþ´¦Àíº¯Êý¡£¶øProactorģʽÖУ¬Óû§Ï߳̽«AsynchronousOperation£¨¶Á/дµÈ£©¡¢ProactorÒÔ¼°²Ù×÷Íê³ÉʱµÄCompletionHandler×¢²áµ½AsynchronousOperationProcessor¡£AsynchronousOperationProcessorʹÓÃFacadeģʽÌṩÁËÒ»×éÒì²½²Ù×÷API£¨¶Á/дµÈ£©¹©Óû§Ê¹Ó㬵±Óû§Ï̵߳÷ÓÃÒì²½APIºó£¬±ã¼ÌÐøÖ´ÐÐ×Ô¼ºµÄÈÎÎñ¡£AsynchronousOperationProcessor
»á¿ªÆô¶ÀÁ¢µÄÄÚºËÏß³ÌÖ´ÐÐÒì²½²Ù×÷£¬ÊµÏÖÕæÕýµÄÒì²½¡£µ±Òì²½IO²Ù×÷Íê³Éʱ£¬AsynchronousOperationProcessor½«Óû§Ïß³ÌÓëAsynchronousOperationÒ»Æð×¢²áµÄProactorºÍCompletionHandlerÈ¡³ö£¬È»ºó½«CompletionHandlerÓëIO²Ù×÷µÄ½á¹ûÊý¾ÝÒ»Æðת·¢¸øProactor£¬Proactor¸ºÔð»Øµ÷ÿһ¸öÒì²½²Ù×÷µÄʼþÍê³É´¦Àíº¯Êýhandle_event¡£ËäÈ»ProactorģʽÖÐÿ¸öÒì²½²Ù×÷¶¼¿ÉÒÔ°ó¶¨Ò»¸öProactor¶ÔÏ󣬵«ÊÇÒ»°ãÔÚ²Ù×÷ϵͳÖУ¬Proactor±»ÊµÏÖΪSingletonģʽ£¬ÒÔ±ãÓÚ¼¯Öл¯·Ö·¢²Ù×÷Íê³Éʼþ¡£

ͼ7 Òì²½IO
Èçͼ7Ëùʾ£¬Òì²½IOÄ£ÐÍÖУ¬Óû§Ïß³ÌÖ±½ÓʹÓÃÄÚºËÌṩµÄÒì²½IO API·¢ÆðreadÇëÇó£¬ÇÒ·¢ÆðºóÁ¢¼´·µ»Ø£¬¼ÌÐøÖ´ÐÐÓû§Ï̴߳úÂë¡£²»¹ý´ËʱÓû§Ïß³ÌÒѾ½«µ÷ÓõÄAsynchronousOperationºÍCompletionHandler×¢²áµ½Äںˣ¬È»ºó²Ù×÷ϵͳ¿ªÆô¶ÀÁ¢µÄÄÚºËÏß³ÌÈ¥´¦ÀíIO²Ù×÷¡£µ±readÇëÇóµÄÊý¾Ýµ½´ïʱ£¬ÓÉÄں˸ºÔð¶ÁÈ¡socketÖеÄÊý¾Ý£¬²¢Ð´ÈëÓû§Ö¸¶¨µÄ»º³åÇøÖС£×îºóÄں˽«readµÄÊý¾ÝºÍÓû§Ïß³Ì×¢²áµÄCompletionHandler·Ö·¢¸øÄÚ²¿Proactor£¬Proactor½«IOÍê³ÉµÄÐÅϢ֪ͨ¸øÓû§Ị̈߳¨Ò»°ãͨ¹ýµ÷ÓÃÓû§Ïß³Ì×¢²áµÄÍê³Éʼþ´¦Àíº¯Êý£©£¬Íê³ÉÒì²½IO¡£
Óû§Ïß³ÌʹÓÃÒì²½IOÄ£Ð͵Äα´úÂëÃèÊöΪ£º
void UserCompletionHandler::handle_event(buffer) { process(buffer); }
{ aoi_read(socket, new UserCompletionHandler); } |
Óû§ÐèÒªÖØÐ´CompletionHandlerµÄhandle_eventº¯Êý½øÐд¦ÀíÊý¾ÝµÄ¹¤×÷£¬²ÎÊýbuffer±íʾProactorÒѾ׼±¸ºÃµÄÊý¾Ý£¬Óû§Ïß³ÌÖ±½Óµ÷ÓÃÄÚºËÌṩµÄÒì²½IO
API£¬²¢½«ÖØÐ´µÄCompletionHandler×¢²á¼´¿É¡£
Ïà±ÈÓÚIO¶à·¸´ÓÃÄ£ÐÍ£¬Òì²½IO²¢²»Ê®·Ö³£Ó㬲»ÉÙ¸ßÐÔÄܲ¢·¢·þÎñ³ÌÐòʹÓÃIO¶à·¸´ÓÃÄ£ÐÍ+¶àÏß³ÌÈÎÎñ´¦ÀíµÄ¼Ü¹¹»ù±¾¿ÉÒÔÂú×ãÐèÇ󡣿öÇÒĿǰ²Ù×÷ϵͳ¶ÔÒì²½IOµÄÖ§³Ö²¢·ÇÌØ±ðÍêÉÆ£¬¸ü¶àµÄÊDzÉÓÃIO¶à·¸´ÓÃÄ£ÐÍÄ£ÄâÒì²½IOµÄ·½Ê½£¨IOʼþ´¥·¢Ê±²»Ö±½Ó֪ͨÓû§Ị̈߳¬¶øÊǽ«Êý¾Ý¶ÁдÍê±Ïºó·Åµ½Óû§Ö¸¶¨µÄ»º³åÇøÖУ©¡£Java7Ö®ºóÒѾ֧³ÖÁËÒì²½IO£¬¸ÐÐËȤµÄ¶ÁÕß¿ÉÒÔ³¢ÊÔʹÓá£
±¾ÎÄ´Ó»ù±¾¸ÅÄî¡¢¹¤×÷Á÷³ÌºÍ´úÂëʾÀýÈý¸ö²ã´Î¼òÒªÃèÊöÁ˳£¼ûµÄËÄÖÖ¸ßÐÔÄÜIOÄ£Ð͵ĽṹºÍÔÀí£¬ÀíÇåÁËͬ²½¡¢Òì²½¡¢×èÈû¡¢·Ç×èÈûÕâЩÈÝÒ×»ìÏýµÄ¸ÅÄͨ¹ý¶Ô¸ßÐÔÄÜIOÄ£Ð͵ÄÀí½â£¬¿ÉÒÔÔÚ·þÎñ¶Ë³ÌÐòµÄ¿ª·¢ÖÐÑ¡Ôñ¸ü·ûºÏʵ¼ÊÒµÎñÌØµãµÄIOÄ£ÐÍ£¬Ìá¸ß·þÎñÖÊÁ¿¡£Ï£Íû±¾ÎĶÔÄãÓÐËù°ïÖú¡£
|