¡¡¡¡´«Í³µÄ½â¾ö·½·¨
¡¡¡¡Í¨³£ÔÚJavaÖд¦Àí¶ÂÈûI/OÒªÓõ½Ị̈߳¨´óÁ¿µÄỊ̈߳©¡£Í¨³£ÊÇʵÏÖÒ»¸öÏ̳߳ØÓÃÀ´´¦ÀíÇëÇó£¬Èçͼ¶þ
ͼ¶þ
¡¡¡¡Ïß³ÌʹµÃserverÄܹ»´¦Àí¶à¸öÁ¬½Ó£¬¿ÉÊÇËüÃÇÒ²ÏàͬÒý·¢Á˺ܶàÎÊÌ⡣ÿһ¸öÏß³ÌÓµÓÐ×Ô¼ºµÄÕ»¿Õ¼ä²¢ÇÒÕ¼ÓÃһЩCPUʱ¼ä£¬ºÄ·Ñ·Ç³£´ó£¬²¢Çҷdz£¶àʱ¼äÊÇÀË·ÑÔÚ¶ÂÈûµÄI/O²Ù×÷ÉÏ£¬Ã»ÓÐÓÐЧµÄÀûÓÃCPU¡£
¡¡¡¡Èý. ÐÂI/O
¡¡¡¡1£® Buffer
¡¡¡¡´«Í³µÄI/O²»¶ÏµÄÀ˷ѶÔÏó×ÊÔ´£¨Ò»°ãÊÇString£©¡£ÐÂI/Oͨ¹ýʹÓÃBuffer¶ÁдÊý¾Ý±ÜÃâÁË×ÊÔ´ÀË·Ñ¡£Buffer¶ÔÏóÊÇÏßÐԵģ¬ÓÐÐòµÄÊý¾Ý¼¯ºÏ£¬ËüÒÀ¾ÝÆäÀà±ð½ö½ö°üÀ¨Î¨Ò»µÄÊý¾ÝÀàÐÍ¡£
¡¡¡¡java.nio.Buffer ÀàÃèдÐðÊö
¡¡¡¡java.nio.ByteBuffer °üÀ¨×Ö½ÚÀàÐÍ¡£ Äܹ»´ÓReadableByteChannelÖжÁÔÚ WritableByteChannelÖÐд
¡¡¡¡java.nio.MappedByteBuffer °üÀ¨×Ö½ÚÀàÐÍ£¬Ö±½ÓÔÚÄÚ´æijһÇøÓòÓ³Éä
¡¡¡¡java.nio.CharBuffer °üÀ¨×Ö·ûÀàÐÍ£¬²»ÄÜдÈëͨµÀ
¡¡¡¡java.nio.DoubleBuffer °üÀ¨doubleÀàÐÍ£¬²»ÄÜдÈëͨµÀ
¡¡¡¡java.nio.FloatBuffer °üÀ¨floatÀàÐÍ
¡¡¡¡java.nio.IntBuffer °üÀ¨intÀàÐÍ
¡¡¡¡java.nio.LongBuffer °üÀ¨longÀàÐÍ
¡¡¡¡java.nio.ShortBuffer °üÀ¨shortÀàÐÍ
¡¡¡¡Äܹ»Í¨¹ýµ÷ÓÃallocate(int capacity)·½·¨»òÕßallocateDirect(int capacity)·½·¨·ÖÅäÒ»¸öBuffer¡£ÌرðµÄ£¬ÄãÄܹ»´´½¨MappedBytesBufferͨ¹ýµ÷ÓÃFileChannel.map(int mode,long position,int size)¡£Ö±½Ó£¨direct£©bufferÔÚÄÚ´æÖзÖÅäÒ»¶ÎÁ¬ÐøµÄ¿é²¢Ê¹Óñ¾µØÔLÎÊ·½·¨¶ÁдÊý¾Ý¡£·ÇÖ±½Ó(nondirect)bufferͨ¹ýʹÓÃJavaÖеÄÊý×éÔLÎÊ´úÂë¶ÁдÊý¾Ý¡£ÓÐʱºò±ØÐëʹÓ÷ÇÖ±½Ó»º³å±ÈÈçʹÓò»ÂÛʲôµÄwrap·½·¨£¨ÈçByteBuffer.wrap(byte[])£©ÔÚJavaÊý×é»ù´¡ÉÏ´´½¨buffer¡£
¡¡¡¡2£® ×Ö·û±àÂë
¡¡¡¡ÏòByteBufferÖдæ·ÅÊý¾ÝÉæ¼°µ½Á½¸öÎÊÌ⣺×Ö½ÚµÄ˳ÐòºÍ×Ö·ûת»»¡£ByteBufferÄÚ²¿Í¨¹ýByteOrderÀà´¦ÀíÁË×Ö½Ú˳ÐòÎÊÌ⣬¿ÉÊDz¢Ã»Óд¦Àí×Ö·ûת»»¡£Æäʵ£¬ByteBufferûÓÐÌṩ·½·¨¶ÁдString¡£
¡¡¡¡Java.nio.charset.Charset´¦ÀíÁË×Ö·ûת»»ÎÊÌâ¡£Ëüͨ¹ý¹¹ÔìCharsetEncoderºÍCharsetDecoder½«×Ö·ûÐòÁÐת»»³É×Ö½ÚºÍÄæת»»¡£
¡¡¡¡3£® ͨµÀ(Channel)
¡¡¡¡Äã¿ÉÄÜ×¢Òâµ½ÏÖÓеÄjava.ioÀàÖÐûÓÐÒ»¸öÄܹ»¶ÁдBufferÀàÐÍ£¬ËùÒÔNIOÖÐÌṩÁËChannelÀàÀ´¶ÁдBuffer¡£Í¨µÀÄܹ»¾õµÃÊÇÒ»ÖÖÁ¬½Ó£¬Äܹ»Êǵ½Ìض¨É豸£¬³ÌÐò»òÕßÊÇÍøÂçµÄÁ¬½Ó¡£Í¨µÀµÄÀàµÈ¼¶½á¹¹Í¼ÀýÈçÒÔÏÂ
ͼÈý
¡¡¡¡Í¼ÖÐReadableByteChannelºÍWritableByteChannel·Ö±ðÓÃÓÚ¶Áд¡£
¡¡¡¡GatheringByteChannelÄܹ»´ÓʹÓÃÒ»´Î½«¶à¸öBufferÖеÄÊý¾ÝдÈëͨµÀ£¬Ïà·´µÄ£¬ScatteringByteChannelÔòÄܹ»Ò»´Î½«Êý¾Ý´ÓͨµÀ¶ÁÈë¶à¸öBufferÖС£Ä㻹Äܹ»ÉèÖÃͨµÀʹÆäΪ¶ÂÈû»ò·Ç¶ÂÈûI/O²Ù×÷·þÎñ¡£
¡¡¡¡ÎªÁËʹͨµÀ¿ÉÒÔͬ´«Í³I/OÀàÏàÈÝ£¬ChannelÀàÌṩÁ˾²Ì¬·½·¨´´½¨Stream»òReader
¡¡¡¡4£® Selector
¡¡¡¡ÔÚ¹ýÈ¥µÄ¶ÂÈûI/OÖУ¬ÎÒÃÇÒ»°ãÖªµÀʲôʱºòÄܹ»ÏòstreamÖжÁ»òд£¬ÓÉÓÚ·½·¨µ÷ÓÃÖ±µ½stream×¼±¸ºÃʱ·µ»Ø¡£¿ÉÊÇʹÓ÷ǶÂÈûͨµÀ£¬ÎÒÃÇÐëҪһЩ·½·¨À´ÖªµÀʲôʱºòͨµÀ×¼±¸ºÃÁË¡£ÔÚNIO°üÖУ¬Éè¼ÆSelector¾ÍÊÇΪÁËÕâ¸öÄ¿µÄ¡£SelectableChannelÄܹ»×¢ƒÔÌض¨µÄʼþ£¬¶ø²»ÊÇÔÚʼþ·¢Éúʱ֪ͨӦÓã¬Í¨µÀ¸ú×Ùʼþ¡£È»ºó£¬µ±Ó¦Óõ÷ÓÃSelectorÉϵÄËæÒâÒ»¸öselection·½·¨Ê±£¬Ëü²é¿´×¢ƒÔÁ˵ÄͨµÀ¿´ÊÇ·ñÓв»ÂÛʲô¸ÐÐËȤµÄʼþ·¢Éú¡£Í¼ËÄÊÇselectorºÍÁ½¸öÒÑ×¢ƒÔµÄͨµÀµÄÑùÀý
ͼËÄ
¡¡¡¡²¢·ÇÈ«²¿µÄͨµÀ¶¼Ö§³ÖÈ«²¿µÄ²Ù×÷¡£SelectionKeyÀඨÒåÁËÈ«²¿¿ÉÄܵIJÙ×÷룬½«ÒªÓÃÁ½´Î¡£Ê×ÏÈ£¬µ±Ó¦Óõ÷ÓÃSelectableChannel.register(Selector sel,int op)·½·¨×¢ƒÔͨµÀʱ£¬Ëü½«ËùÐè²Ù×÷×÷ΪµÚ¶þ¸ö…¢Êý´«µÝµ½·½·¨ÖС£È»ºó£¬Ò»µ©SelectionKey±»Ñ¡ÖÐÁË£¬SelectionKeyµÄreadyOps()·½·¨·µ»ØÈ«²¿Í¨µÀÖ§³Ö²Ù×÷µÄÊýλµÄºÍ¡£SelectableChannelµÄvalidOps·½·¨·µ»Øÿһ¸öͨµÀͬÒâµÄ²Ù×÷¡£×¢ƒÔͨµÀ²»Ö§³ÖµÄ²Ù×÷½«Òý·¢IllegalArgumentExceptionÒì³£¡£Ï±íÁгöÁËSelectableChannel×ÓÀàËùÖ§³ÖµÄ²Ù×÷¡£
¡¡¡¡ServerSocketChannel OP_ACCEPT
¡¡¡¡SocketChannel OP_CONNECT, OP_READ, OP_WRITE
¡¡¡¡DatagramChannel OP_READ, OP_WRITE
¡¡¡¡Pipe.SourceChannel OP_READ
¡¡¡¡Pipe.SinkChannel OP_WRITE
¡¡¡¡ËÄ. ¾ÙÀý˵Ã÷
¡¡¡¡1£® ¼òµ¥ÍøÒ³ÄÚÈÝÏÂÔØ
¡¡¡¡Õâ¸öÑùÀýºÜeasy£¬ÀàSocketChannelReaderʹÓÃSocketChannelÀ´ÏÂÔØÌض¨ÍøÒ³µÄHTMLÄÚÈÝ¡£
package examples.nio; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; import java.net.InetSocketAddress; import java.io.IOException; public class SocketChannelReader{ private Charset charset=Charset.forName("UTF-8");//´´½¨UTF-8×Ö·û¼¯ private SocketChannel channel; public void getHTMLContent(){ try{ connect(); sendRequest(); readResponse(); }catch(IOException e){ System.err.println(e.toString()); }finally{ if(channel!=null){ try{ channel.close(); }catch(IOException e){} } } } private void connect()throws IOException{//Á¬½Óµ½CSDN InetSocketAddress socketAddress= new InetSocketAddress("http://www.csdn.net",80/); channel=SocketChannel.open(socketAddress); //ʹÓù¤³§·½·¨open´´½¨Ò»¸öchannel²¢½«ËüÁ¬½Óµ½Ö¸¶¨µØÖ·ÉÏ //Ï൱ÓëSocketChannel.open().connect(socketAddress);µ÷Óà } private void sendRequest()throws IOException{ channel.write(charset.encode("GET " +"/document" +"\r\n\r\n"));//·¢ËÍGETÇëÇóµ½CSDNµÄÎĵµÖÐÐÄ //ʹÓÃchannel.write·½·¨£¬ËüÐëÒªCharByteÀàÐ͵ą¢Êý£¬Ê¹Óà //Charset.encode(String)·½·¨×ª»»×Ö·û´®¡£ } private void readResponse()throws IOException{//¶ÁÈ¡Ó¦´ð ByteBuffer buffer=ByteBuffer.allocate(1024);//´´½¨1024×ֽڵĻº³å while(channel.read(buffer)!=-1){ buffer.flip();//flip·½·¨ÔÚ¶Á»º³åÇø×Ö½Ú²Ù×÷֮ǰµ÷ÓᣠSystem.out.println(charset.decode(buffer)); //ʹÓÃCharset.decode·½·¨½«×Ö½Úת»»Îª×Ö·û´® buffer.clear();//Çå¿Õ»º³å } } public static void main(String [] args){ new SocketChannelReader().getHTMLContent(); } |