±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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 Éæ¼°µ½ºÜ¶àÆäËû·½ÃæÖªÊ¶£¬ÕâÀïÔÝʱ²»×ö½éÉÜ£¬ºóÐøÎÄÕ½«µ¥¶À½éÉÜÒì²½ÈÎÎñµÈÏà¹ØÄÚÈÝ¡£ |