Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Ïê½â Java NIO
 
  2106  次浏览      31
 2018-6-27
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcnblogs£¬±¾ÎÄÏêϸ´Ó»º´æÇø¡¢Í¨µÀ¡¢Ñ¡ÔñÆ÷Èý¸ö·½Ãæ²ûÊöÁË Java NIO °ü£¬Ï£Íû¶Ô´ó¼ÒµÄѧϰÄÜÓÐËù°ïÖú¡£

ÎļþµÄ³éÏ󻯱íʾ£¬×Ö½ÚÁ÷ÒÔ¼°×Ö·ûÁ÷µÄÎļþ²Ù×÷µÈÊôÓÚ´«Í³ IO µÄÏà¹ØÄÚÈÝ£¬ÎÒÃÇÒѾ­ÔÚÇ°ÃæµÄÎÄÕ½øÐÐÁ˽ÏΪÉî¿ÌµÄѧϰÁË¡£

µ«ÊÇ´«Í³µÄ IO Á÷»¹ÊÇÓкܶàȱÏݵģ¬ÓÈÆäËüµÄ×èÈûÐÔ¼ÓÉÏ´ÅÅ̶Áд±¾À´¾ÍÂý£¬»áµ¼Ö CPU ʹÓÃЧÂÊ´ó´ó½µµÍ¡£

ËùÒÔ£¬jdk 1.4 ·¢²¼ÁË NIO °ü£¬NIO µÄÎļþ¶ÁдÉè¼Æµß¸²ÁË´«Í³ IO µÄÉè¼Æ£¬²ÉÓáºÍ¨µÀ¡»+¡º»º´æÇø¡»Ê¹µÃÐÂʽµÄ IO ²Ù×÷Ö±½ÓÃæÏò»º´æÇø£¬²¢ÇÒÊÇ·Ç×èÈûµÄ£¬¶ÔÓÚЧÂʵÄÌáÉýÕæ²»ÊÇÒ»µãÁ½µã£¬ÎÒÃÇÒ»ÆðÀ´¿´¿´¡£

ͨµÀ Channel

ÎÒÃÇ˵¹ý£¬NIO µÄºËÐľÍÊÇͨµÀºÍ»º´æÇø£¬ËùÒÔËüÃǵŤ×÷ģʽÊÇÕâÑùµÄ£º

ͨµÀÓеãÀàËÆ IO ÖеÄÁ÷£¬µ«²»Í¬µÄÊÇ£¬Í¬Ò»¸öͨµÀ¼ÈÔÊÐí¶ÁÒ²ÔÊÐíд£¬¶øÈÎÒâÒ»¸öÁ÷ҪôÊǶÁÁ÷ҪôÊÇдÁ÷¡£

µ«ÊÇÄãÒªÃ÷°×Ò»µã£¬Í¨µÀºÍÁ÷Ò»Ñù¶¼ÊÇÐèÒª»ùÓÚÎïÀíÎļþµÄ£¬¶øÃ¿¸öÁ÷»òÕßͨµÀ¶¼Í¨¹ýÎļþÖ¸Õë²Ù×÷Îļþ£¬ÕâÀï˵µÄ¡¸Í¨µÀÊÇË«ÏòµÄ¡¹Ò²ÊÇÓÐǰÌáµÄ£¬ÄǾÍÊÇͨµÀ»ùÓÚËæ»ú·ÃÎÊÎļþ¡ºRandomAccessFile¡»µÄ¿É¶Á¿ÉдÎļþÖ¸Õë¡£

¡ºRandomAccessFile¡»ÊǼȿɶÁÓÖ¿ÉдµÄ£¬ËùÒÔ»ùÓÚËüµÄͨµÀÊÇË«ÏòµÄ£¬ËùÒÔ£¬¡¸Í¨µÀÊÇË«ÏòµÄ¡¹Õâ¾ä»°ÊÇÓÐǰÌáµÄ£¬²»ÄܶÏÕÂÈ¡Òå¡£

»ù±¾µÄͨµÀÀàÐÍÓÐÈçÏÂһЩ£º

FileChannel

DatagramChannel

SocketChannel

ServerSocketChannel

FileChannel ÊÇ»ùÓÚÎļþµÄͨµÀ£¬SocketChannel ºÍ ServerSocketChannel ÓÃÓÚÍøÂç TCP Ì×½Ó×ÖÊý¾Ý±¨¶Áд£¬DatagramChannel ÊÇÓÃÓÚÍøÂç UDP Ì×½Ó×ÖÊý¾Ý±¨¶Áд¡£

ͨµÀ²»Äܵ¥¶À´æÔÚ£¬ËüÓÀÔ¶ÐèÒª°ó¶¨Ò»¸ö»º´æÇø£¬ËùÓеÄÊý¾ÝÖ»»á´æÔÚÓÚ»º´æÇøÖУ¬ÎÞÂÛÄãÊÇд»òÊǶÁ£¬±ØÈ»ÊÇ»º´æÇøÍ¨¹ýͨµÀµ½´ï´ÅÅÌÎļþ£¬»òÊÇ´ÅÅÌÎļþͨ¹ýͨµÀµ½´ï»º´æÇø¡£

¼´»º´æÇøÊÇÊý¾ÝµÄ¡¸Æðµã¡¹£¬Ò²ÊÇ¡¸Öյ㡹£¬¾ßÌåÕâЩͨµÀµ½µ×ÓÐÄÄЩ²»Í¬ÒÔ¼°¸ÃÈçºÎʹÓ㬻ù±¾ÊµÏÖÈçºÎ£¬ÎÒÃǽéÉÜÍ꡺»º´æÇø¡»¸ÅÄîºó£¬ÔÙ×öÏêϸѧϰ¡£

»º´æÇø Buffer

Buffer ÊÇËùÓоßÌ建´æÇøµÄ»ùÀ࣬ÊÇÒ»¸ö³éÏóÀ࣬ËüµÄʵÏÖÀàÓкܶ࣬°üº¬¸÷ÖÖÀàÐÍÊý¾ÝµÄ»º´æ¡£

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

LongBuffer

FloatBuffer

DoubleBuffer

MappedByteBuffer

ÎÒÃÇÒÔ ByteBuffer ΪÀý½øÐÐѧϰ£¬ÆäÓàµÄ»º´æÇøÒ²¶¼ÊÇ»ùÓÚ×Ö½Ú»º´æÇøµÄ£¬Ö»²»¹ý¶àÁËÒ»²½×Ö½Úת»»¹ý³Ì¶øÒÑ£¬MappedByteBuffer ÊÇÒ»¸öÌØÊâµÄ»º´æ·½Ê½£¬ÎÒÃǻᵥ¶À½éÉÜ¡£

Buffer ÖÐÓм¸¸öÖØÒªµÄ³ÉÔ±ÊôÐÔ£¬ÎÒÃÇÁ˽âһϣº

private int mark = -1;
private int position = 0;
private int limit;
private int capacity;
long address;

mark ÊôÐÔÎÒÃÇÒѾ­²»Ä°ÉúÁË£¬ÓÃÓÚÖØ¸´¶Á¡£capacity ÃèÊö»º´æÇøÈÝÁ¿£¬¼´Õû¸ö»º´æÇø×î´óÄÜ´æ´¢¶àÉÙÊý¾ÝÁ¿¡£address ÓÃÓÚ²Ù×÷Ö±½ÓÄÚ´æ£¬Çø±ðÓÚ jvm Äڴ棬ÕâÒ»µã´ý»á˵Ã÷¡£

¶ø position ºÍ limit ÎÒÏëÓÃÒ»ÕÅͼ½áºÏ½âÊÍ£º

ÓÉÓÚ»º´æÇøÊǶÁд¹²´æµÄ£¬ËùÒÔ²»Í¬µÄģʽÏ£¬ÕâÁ½¸ö±äÁ¿µÄÖµÒ²¾ßÓв»Í¬µÄÒâÒå¡£

дģʽÏ£¬Ëùνдģʽ¾ÍÊǽ«»º´æÇøÖеÄÄÚÈÝдÈëͨµÀ¡£position ´ú±íÏÂÒ»¸ö×Ö½ÚÓ¦¸Ã±»Ð´³öÈ¥µÄ×Ö½ÚÔÚ»º´æÇøÖеÄλÖã¬limit ±íʾ×îºóÒ»¸ö´ýд×Ö½ÚÔÚ»º´æÇøµÄλÖá£

¶ÁģʽÏ£¬Ëùν¶Áģʽ¾ÍÊÇ´ÓͨµÀ¶ÁÈ¡Êý¾Ýµ½»º´æÇø¡£position ´ú±íÏÂÒ»¸ö¶Á³öÀ´µÄ×Ö½ÚÓ¦µ±´æ´¢ÔÚ»º´æÇøµÄλÖã¬limit µÈÓÚ capacity¡£

Ïà¹ØµÄ¶Áд²Ù×÷ϸ½Ú£¬´ý»á»áºÍ´ó¼ÒÒ»Æð¿´Ô´Â룬ÒÔ¼ÓÉî¶ÔͨµÀºÍ»º´æÇøÐ­×÷¹¤×÷µÄÔ­Àí£¬ÕâÀïÎÒÃÇÏÈÌÖÂÛÒ»¸ö´ó¼Ò¿ÉÄÜûÔõô¹Ø×¢¹ýµÄÒ»¸öÎÊÌâ¡£

JVM ÄÚ´æ»®·ÖΪջºÍ¶Ñ£¬ÕâÊÇ´ó¼ÒÉîÈëÄÔº£µÄ֪ʶ£¬µ«ÊÇÆäʵ»®·Ö¸ø JVM µÄ»¹ÓÐÒ»¿é¶ÑÍâÄڴ棬Ҳ¾ÍÊÇÖ±½ÓÄڴ棬ºÜ¶àÈ˲»ÖªµÀÕâ¿éÄÚ´æÊǸÉʲôÓõġ£

ÕâÊÇÒ»¿éÎïÀíÄڴ棬רÃÅÓÃÓÚ JVM ºÍ IO É豸´ò½»µÀ£¬Java µ×²ãʹÓà C ÓïÑ﵀ API µ÷ÓòÙ×÷ϵͳÓë IO É豸½øÐн»»¥¡£

ÀýÈ磬Java ÄÚ´æÖÐÓÐÒ»¸ö×Ö½ÚÊý×飬ÏÖÔÚµ÷ÓÃÁ÷½«ËüдÈë´ÅÅÌÎļþ£¬ÄÇô JVM Ê×ÏȻὫÕâ¸ö×Ö½ÚÊý×éÏÈ¿½±´Ò»·Ýµ½¶ÑÍâÄÚ´æÖУ¬È»ºóµ÷Óà C ÓïÑÔ API Ö¸Ã÷½«Ä³¸öÁ¬ÐøµØÖ··¶Î§µÄÊý¾ÝдÈë´ÅÅÌ¡£

¶Á²Ù×÷Ò²ÊÇÀàËÆ£¬¶ø JVM ¶îÍâ×öµÄ¿½±´¹¤×÷Ò²ÊÇÓÐÒâÒåµÄ£¬ÒòΪ JVM ÊÇ»ùÓÚ×Ô¶¯À¬»ø»ØÊÕ»úÖÆÔËÐеģ¬ËùÓÐÄÚ´æÖеÄÊý¾Ý»áÔÚ GC ʱ²»Í£µÄ±»Òƶ¯£¬Èç¹ûÄãµ÷ÓÃϵͳ API ¸æËß²Ù×÷ϵͳ½«ÄÚ´æÄ³Ä³Î»ÖõÄÄÚ´æÐ´Èë´ÅÅÌ£¬¶ø´Ëʱ·¢Éú GC ÒÆ¶¯Á˸ò¿·ÖÊý¾Ý£¬GC ½áÊøºó²Ù×÷ϵͳÊDz»ÊǾÍд´íÊý¾ÝÁË¡£

ËùÒÔ£¬JVM ¶ÔÓÚÓëÍâΧ IO É豸½»»¥µÄÇé¿öÏ£¬¶¼»á½«ÄÚ´æÊý¾Ý¸´ÖÆÒ»·Ýµ½¶ÑÍâÄÚ´æÖУ¬È»ºóµ÷ÓÃϵͳ API ¼ä½ÓµÄдÈë´ÅÅÌ£¬¶ÁÒ²ÊÇÀàËÆµÄ¡£ÓÉÓÚ¶ÑÍâÄÚ´æ²»ÊÜ GC ¹ÜÀí£¬ËùÒÔÓÃÍêÒ»¶¨µÃ¼ÇµÃÊÍ·Å¡£

Àí½âÕâÒ»¸öС֪ʶÊÇ¿´¶®Ô´ÂëʵÏÖµÄǰÌᣬ²»È»Äã¿ÉÄܲ»ÖªµÀ´úÂëʵÏÖÕßÔÚ×öʲô¡£ºÃÁË£¬ÄÇÎÒÃǾÍÏÈÀ´¿´¿´¶Á²Ù×÷µÄ»ù±¾Ê¹ÓÃÓëÔ´ÂëʵÏÖ¡£

RandomAccessFile file = new RandomAccessFile
("C:\\Users\\yanga\\Desktop\\note.txt","rw");
FileChannel channel = file.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);

buffer.flip();
byte[] res = new byte[1024];
buffer.get(res,0,buffer.limit());
System.out.println(new String(res));

channel.close();

ÎÒÃÇ¿´Õâôһ¶Î´úÂ룬Õâ¶Î´úÂëÎÒ´óÖ·ֳÉÁËËĸö²¿·Ö£¬µÚÒ»²¿·ÖÓÃÓÚ»ñÈ¡ÎļþͨµÀ£¬µÚ¶þ²¿·ÖÓÃÓÚ·ÖÅ仺´æÇø²¢Íê³É¶Á²Ù×÷£¬µÚÈý²¿·ÖÓÃÓÚ½«»º´æÇøÖÐÊý¾Ý½øÐдòÓ¡£¬µÚËIJ¿·ÖΪ¹Ø±ÕͨµÀÁ¬½Ó¡£

µÚÒ»²¿·Ö£º

getChannel ·½·¨ÓÃÓÚ»ñȡһ¸öÎļþÏà¹ØµÄͨµÀʵÀý£¬¾ßÌåʵÏÖÈçÏ£º

public final FileChannel getChannel() {
synchronized (this) {
if (channel == null) {
channel = FileChannelImpl.open(fd, path, true, rw, this);
}
return channel;
}
}

public static FileChannel open
(FileDescriptor var0, String var1, boolean var2, boolean var3, Object var4) {
return new FileChannelImpl(var0, var1, var2, var3, false, var4);
}

getChannel ·½·¨»áµ÷Óà FileChannelImpl µÄ¹¤³§·½·¨¹¹½¨Ò»¸ö FileChannelImpl ʵÀý£¬FileChannelImpl ÊdzéÏóÀà FileChannel µÄÒ»¸ö×ÓÀàʵÏÖ¡£

¹¹³É FileChannelImpl ʵÀýËùÐèµÄ±ØÒª²ÎÊýÓУ¬¸ÃÎļþµÄÎļþÖ¸Õ룬¸ÃÎļþµÄÍêÕû·¾¶£¬¶ÁдȨÏ޵ȡ£

µÚ¶þ²¿·Ö£º

Buffer µÄ»ù±¾½á¹¹ÎÒÃÇÉÏÊöÒѾ­¼òµ¥½éÉÜÁË£¬ÕâÀï²»ÔÙ׸ÊöÁË£¬ËùνµÄ»º´æÇø£¬±¾ÖÊÉϾÍÊÇ×Ö½ÚÊý×é¡£

public static ByteBuffer allocate(int capacity) {
if (capacity < 0)
throw new IllegalArgumentException();
return new HeapByteBuffer(capacity, capacity);
}

ByteBuffer ʵÀýµÄ¹¹½¨ÊÇͨ¹ý¹¤³§Ä£Ê½²úÉúµÄ£¬±ØÐëÖ¸¶¨²ÎÊý capacity ×÷ΪÄÚ²¿×Ö½ÚÊý×éµÄÈÝÁ¿¡£HeapByteBuffer ÊÇÐéÄâ»úµÄ¶ÑÉÏÄڴ棬ËùÓÐÊý¾Ý¶¼½«´æ´¢Ôڶѿռ䣬ÎÒÃDz»¾Ã½«»á½éÉÜËüµÄÒ»¸öÐֵܣ¬DirectByteBuffer£¬Ëü±»·ÖÅäÔÚ¶ÑÍâÄÚ´æÖУ¬¾ßÌåµÄÒ»»á˵¡£

Õâ¸ö HeapByteBuffer µÄ¹¹ÔìÇé¿öÎÒÃDz»·Á¸ú½øÈ¥¿´¿´£º

HeapByteBuffer(int cap, int lim) {
super(-1, 0, lim, cap, new byte[cap], 0);
}

µ÷Óø¸ÀàµÄ¹¹Ôì·½·¨£¬³õʼ»¯ÎÒÃÇÔÚ ByteBuffer ÖÐÌá¹ýµÄһЩÊôÐÔÖµ£¬Èç position£¬capacity£¬mark£¬limit£¬offset ÒÔ¼°×Ö½ÚÊý×é hb¡£

½Ó×Å£¬ÎÒÃÇ¿´¿´Õâ¸ö read ·½·¨µÄµ÷ÓÃÁ´¡£

Õâ¸ö read ·½·¨ÊÇ×ÓÀà FileChannelImpl ¶Ô¸¸Àà FileChannel read ·½·¨µÄÖØÐ´¡£Õâ¸ö·½·¨²»ÊǶÁ²Ù×÷µÄºËÐÄ£¬ÎÒÃǼòµ¥¸ÅÀ¨Ò»Ï£¬¸Ã·½·¨Ê×ÏÈ»áÄõ½µ±Ç°Í¨µÀʵÀýµÄËø£¬Èç¹ûûÓб»ÆäËûÏß³ÌÕ¼ÓУ¬ÄÇôռÓиÃËø£¬²¢µ÷Óà IOUtil µÄ read ·½·¨¡£

IOUtil µÄ read ·½·¨ÄÚ²¿Ò²µ÷ÓÃÁ˺ܶ෽·¨£¬ÓеÄÉõÖÁÊDZ¾µØ·½·¨£¬ÕâÀïÖ»¼òµ¥½éÉÜÒ»ÏÂÕû¸ö read ·½·¨µÄ´óÌåÂß¼­£¬¾ßÌåϸ½ÚÁô´ý´ó¼Ò×ÔÐÐѧϰ¡£

Ê×ÏÈÅжÏÎÒÃÇµÄ ByteBuffer ʵÀýÊDz»ÊÇÒ»¸ö DirectBuffer£¬Ò²¾ÍÊÇÅжϵ±Ç°µÄ ByteBuffer ʵÀýÊDz»ÊDZ»·ÖÅäÔÚÖ±½ÓÄÚ´æÖУ¬Èç¹ûÊÇ£¬ÄÇô½«µ÷Óà readIntoNativeBuffer ·½·¨´Ó´ÅÅ̶ÁÈ¡Êý¾ÝÖ±½Ó·ÅÈë ByteBuffer ʵÀýËùÔÚµÄÖ±½ÓÄÚ´æÖС£

·ñÔò£¬ÐéÄâ»ú½«ÔÚÖ±½ÓÄÚ´æÇøÓò·ÖÅäÒ»¿éÄڴ棬¸ÃÄÚ´æÇøÓòµÄÊ×µØÖ·´æ´¢ÔÚ var5 ʵÀýµÄ address ÊôÐÔÖС£

½Ó×Å´Ó´ÅÅ̶ÁÈ¡Êý¾Ý·ÅÈë var5 Ëù´ú±íµÄÖ±½ÓÄÚ´æÇøÓòÖС£

×îºó£¬put ·½·¨»á½« var5 Ëù´ú±íµÄÖ±½ÓÄÚ´æÇøÓòÖеÄÊý¾ÝдÈëµ½ var1 Ëù´ú±íµÄ¶ÑÄÚ»º´æÇø²¢ÊÍ·ÅÁÙʱ´´½¨µÄÖ±½ÓÄÚ´æ¿Õ¼ä¡£

ÕâÑù£¬ÎÒÃÇ´«ÈëµÄ»º´æÇøÖоͳɹ¦µÄ±»¶ÁÈëÁËÊý¾Ý¡£Ð´²Ù×÷ÊÇÏà·´µÄ£¬´ó¼Ò¿ÉÒÔ×ÔÐÐÀà±È£¬·´Õý¶ÑÄÚÊý¾ÝÏëÒªµ½´ï´ÅÅ̾ͱض¨Òª¾­¹ý¶ÑÍâÄÚ´æµÄ¸´Öƹý³Ì¡£

µÚÈýµÚËIJ¿·Ö±È½Ï¼òµ¥£¬ÕâÀï²»ÔÙ׸ÊöÁË¡£ÌáÐÑһϣ¬ÏëÒª¸üºÃµÄʹÓÃÕâ¸öͨµÀºÍ»º´æÇø½øÐÐÎļþ¶Áд²Ù×÷£¬Äã¾ÍÒ»¶¨µÃ¶Ô»º´æÇøµÄ¼¸¸ö±äÁ¿µÄֵʱ¿Ì°ÑÎÕס£¬position ºÍ limit µ±Ç°µÄÖµÊÇʲô£¬´óÖÂʲôλÖã¬Ò»¶¨µÃÇåÎú£¬·ñÔòÕâ¸ö¶Áд¹²´æµÄ»º´æÇø¿ÉÄÜ»áÈÃÄãÔÎͷתÏò¡£

Ñ¡ÔñÆ÷ Selector

Selector ÊÇ Java NIO µÄÒ»¸ö×é¼þ£¬ËüÓÃÓÚ¼àÌý¶à¸ö Channel µÄ¸÷ÖÖ״̬£¬ÓÃÓÚ¹ÜÀí¶à¸ö Channel¡£µ«±¾ÖÊÉÏÓÉÓÚ FileChannel ²»Ö§³Ö×¢²áÑ¡ÔñÆ÷£¬ËùÒÔ Selector Ò»°ã±»ÈÏΪÊÇ·þÎñÓÚÍøÂçÌ×½Ó×ÖͨµÀµÄ¡£

¶ø´ó¼Ò¿ÚÖеġ¸NIO ÊÇ·Ç×èÈûµÄ¡¹£¬×¼È·À´Ëµ£¬Ö¸µÄÊÇÍøÂç±à³ÌÖпͻ§¶ËÓë·þÎñ¶ËÁ¬½Ó½»»»Êý¾ÝµÄ¹ý³ÌÊÇ·Ç×èÈûµÄ¡£ÆÕͨµÄÎļþ¶ÁдÒÀÈ»ÊÇ×èÈûµÄ£¬ºÍ IO ÊÇÒ»ÑùµÄ£¬ÕâÒ»µã¿ÉÄܺܶà³õѧÕß»á㣬°üÀ¨ÎÒµ±Ê±Ò²×ÜÏ벻ͨΪʲô˵ NIO µÄÎļþ¶ÁдÊÇ·Ç×èÈûµÄ£¬Ã÷Ã÷¾ÍÊÇ×èÈûµÄ¡£

´´½¨Ò»¸öÑ¡ÔñÆ÷Ò»°ãÊÇͨ¹ý Selector µÄ¹¤³§·½·¨£¬Selector.open £º

Selector selector = Selector.open();

¶øÒ»¸öͨµÀÏëҪע²áµ½Ä³¸öÑ¡ÔñÆ÷ÖУ¬±ØÐëµ÷ÕûģʽΪ·Ç×èÈûģʽ£¬ÀýÈ磺

//´´½¨Ò»¸ö TCP Ì×½Ó×ÖͨµÀ
SocketChannel channel = SocketChannel.open();
//µ÷ÕûͨµÀΪ·Ç×èÈûģʽ
channel.configureBlocking(false);
//ÏòÑ¡ÔñÆ÷×¢²áÒ»¸öͨµÀ
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);

ÒÔÉÏ´úÂëÊÇ×¢²áÒ»¸öͨµÀµ½Ñ¡ÔñÆ÷ÖеÄ×î¼òµ¥°æ±¾£¬Ö§³Ö×¢²áÑ¡ÔñÆ÷µÄͨµÀ¶¼ÓÐÒ»¸ö register ·½·¨£¬¸Ã·½·¨¾ÍÊÇÓÃÓÚ×¢²áµ±Ç°ÊµÀýͨµÀµ½Ö¸¶¨Ñ¡ÔñÆ÷µÄ¡£

¸Ã·½·¨µÄµÚÒ»¸ö²ÎÊý¾ÍÊÇÄ¿±êÑ¡ÔñÆ÷£¬µÚ¶þ¸ö²ÎÊýÆäʵÊÇÒ»¸ö¶þ½øÖÆÑÚÂ룬ËüÖ¸Ã÷µ±Ç°Ñ¡ÔñÆ÷¸ÐÐËȤµ±Ç°Í¨µÀµÄÄÄЩʼþ¡£ÒÔö¾ÙÀàÐÍÌṩÁËÒÔϼ¸ÖÖȡֵ£º

int OP_READ = 1 << 0;

int OP_WRITE = 1 << 2;

int OP_CONNECT = 1 << 3;

int OP_ACCEPT = 1 << 4;

ÕâÖÖÓöþ½øÖÆÑÚÂëÀ´±íʾijЩ״̬µÄ»úÖÆ£¬ÎÒÃÇÔÚ½²ÊöÐéÄâ»úÀàÀàÎļþ½á¹¹µÄʱºòÒ²Óöµ½¹ý£¬Ëü¾ÍÊÇÓÃÒ»¸ö¶þ½øÖÆÎ»À´ÃèÊöÒ»ÖÖ״̬¡£

register ·½·¨»á·µ»ØÒ»¸ö SelectionKey ʵÀý£¬¸ÃʵÀý´ú±íµÄ¾ÍÊÇÑ¡ÔñÆ÷ÓëͨµÀµÄÒ»¸ö¹ØÁª¹ØÏµ¡£Äã¿ÉÒÔµ÷ÓÃËüµÄ selector ·½·¨·µ»Øµ±Ç°Ïà¹ØÁªµÄÑ¡ÔñÆ÷ʵÀý£¬Ò²¿ÉÒÔµ÷ÓÃËüµÄ channel ·½·¨·µ»Øµ±Ç°¹ØÁª¹ØÏµÖеÄͨµÀʵÀý¡£

³ý´ËÖ®Í⣬SelectionKey µÄ readyOps ·½·¨½«·µ»Øµ±Ç°Ñ¡Ôñ¸ÐÐËȤµ±Ç°Í¨µÀÖÐʼþÖÐ×¼±¸¾ÍÐ÷µÄʼþ¼¯ºÏ£¬ÒÀÈ»·µ»ØµÄÒ»¸öÕûÐÍÊýÖµ£¬Ò²¾ÍÊÇÒ»¸ö¶þ½øÖÆÑÚÂë¡£

ÀýÈ磺

int readySet = selectionKey.readyOps();

¼ÙÈç readySet µÄֵΪ 13£¬¶þ½øÖÆ ¡¸0000 1101¡¹£¬´ÓºóÏòǰÊý£¬µÚһλΪ 1£¬µÚÈýλΪ 1£¬µÚËÄλΪ 1£¬ÄÇô˵Ã÷Ñ¡ÔñÆ÷¹ØÁªµÄͨµÀ£¬¶Á¾ÍÐ÷¡¢Ð´¾ÍÐ÷£¬Á¬½Ó¾ÍÐ÷¡£

ËùÒÔ£¬µ±ÎÒÃÇ×¢²áÒ»¸öͨµÀµ½Ñ¡ÔñÆ÷Ö®ºó£¬¾Í¿ÉÒÔͨ¹ý·µ»ØµÄ SelectionKey ʵÀý¼àÌý¸ÃͨµÀµÄ¸÷ÖÖʼþ¡£

µ±È»£¬Ò»µ©Ä³¸öÑ¡ÔñÆ÷ÖÐ×¢²áÁ˶à¸öͨµÀ£¬ÎÒÃDz»¿ÉÄÜÒ»¸öÒ»¸öµÄ¼Ç¼ËüÃÇ×¢²áʱ·µ»ØµÄ SelectionKey ʵÀýÀ´¼àÌýͨµÀʼþ£¬Ñ¡ÔñÆ÷Ó¦µ±Óз½·¨·µ»ØËùÓÐ×¢²á³É¹¦µÄͨµÀÏà¹ØµÄ SelectionKey ʵÀý¡£

Set<SelectionKey> keys = selector.selectedKeys();

selectedKeys ·½·¨»á·µ»ØÑ¡ÔñÆ÷ÖÐ×¢²á³É¹¦µÄËùÓÐͨµÀµÄ SelectionKey ʵÀý¼¯ºÏ¡£ÎÒÃÇͨ¹ýÕâ¸ö¼¯ºÏµÄ SelectionKey ʵÀý£¬¿ÉÒԵõ½ËùÓÐͨµÀµÄʼþ¾ÍÐ÷Çé¿ö²¢½øÐÐÏàÓ¦µÄ´¦Àí²Ù×÷¡£

ÏÂÃæÎÒÃÇÒÔÒ»¸ö¼òµ¥µÄ¿Í»§¶Ë·þÎñ¶ËÁ¬½ÓͨѶµÄʵÀýÓ¦ÓÃÒ»ÏÂÉÏÊöÀíÂÛ֪ʶ£º

·þÎñ¶Ë´úÂ룺

Õâ¶ÎС³ÌÐòµÄÔËÐеÄʵ¼ÊЧ¹ûÊÇÕâÑùµÄ£¬¿Í»§¶Ë½¨Á¢ÇëÇóµ½·þÎñ¶Ë£¬´ýÇëÇóÍêÈ«½¨Á¢£¬¿Í»§¶Ë»áÈ¥¼ì²é·þÎñ¶ËÊÇ·ñÓÐÊý¾Ýд»Ø£¬¶ø·þÎñ¶ËµÄÈÎÎñ¾ÍºÜ¼òµ¥ÁË£¬½ÓÊÜÈÎÒâ¿Í»§¶ËµÄÇëÇóÁ¬½Ó²¢ÎªËüд»ØÒ»¶ÎÊý¾Ý¡£

±ð¿´Õû¸ö¹ý³ÌºÜ¼òµ¥£¬µ«Ö»ÒªÄãÓÐÒ»µãÄ£ºýµÄµØ·½£¬ÄãÕâ¸ö¹¦ÄܾͲ»¿ÉÄÜʵÏÖ£¬²»ÐÅÄãÊÔÊÔ£¬ÓÈÆäÊǼÓÁËÑ¡ÔñÆ÷µÄ¿Í»§¶Ë´úÂ룬¸üÖµµÃ´ó¼ÒÒ»ÐÐÒ»ÐзÖÎö¡£ÌáÐÑÒ»µãµÄÊÇ£¬´ó¼ÒÓ¦¸ü¶àµÄ¹Ø×¢ÓÚÄÄЩ·½·¨ÊÇ×èÈûµÄ£¬ÄÄЩÊÇ·Ç×èÈûµÄ£¬Õâ»áÓÐÖúÓÚ·ÖÎö´úÂë¡£

ÕâÆäʵҲËãÒ»¸ö×î×î¼òµ¥µÄ·þÎñÆ÷¿Í»§¶ËÇëÇóÄ£ÐÍÁË£¬Àí½âÁËÕâÒ»µãÏàÐÅ»áÓÐÖúÓÚÀí½âä¯ÀÀÆ÷Óë Web ·þÎñÆ÷µÄ¹¤×÷Ô­ÀíµÄ£¬ÕâÀïÎҾͲ»ÔÙ´ø´ó¼Ò·ÖÎöÁË£¬ÓÐÈκβ»Í¬¿´·¨µÄÒ²»¶Ó­¸øÎÒÁôÑÔ£¬ÔÛÃÇÒ»Æðѧϰ̽ÌÖ¡£

Ïë±ØÄãÒ²ÄÜ·¢ÏÖ£¬¼ÓÁËÑ¡ÔñÆ÷µÄ´úÂë»á¸´ÔӺܶ࣬Ҳ²¢²»Ò»¶¨¸ßЧÓÚÔ­À´µÄ´úÂ룬ÕâÆäʵÊÇÒòΪÄãµÄ¹¦ÄܱȽϼòµ¥£¬²¢²»Éæ¼°´óÁ¿Í¨µÀ´¦Àí£¬Âß¼­Ò»µ©¸´ÔÓÆðÀ´£¬Ñ¡ÔñÆ÷¸øÄã´øÀ´µÄºÃ´¦»á·Ç³£Ã÷ÏÔ¡£

Æäʵ£¬NIO Öл¹ÓÐÒ»¿é AIO £¬Ò²¾ÍÊÇÒì²½ IO ²¢Ã»ÓнéÉÜ£¬ÒòΪÒì²½ IO Éæ¼°µ½ºÜ¶àÆäËû·½ÃæÖªÊ¶£¬ÕâÀïÔÝʱ²»×ö½éÉÜ£¬ºóÐøÎÄÕ½«µ¥¶À½éÉÜÒì²½ÈÎÎñµÈÏà¹ØÄÚÈÝ¡£

   
2106 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö