Java NIOÓëIOµÄ²î±ðºÍ±È½Ï

·¢±íÓÚ£º2014-10-21 09:52

×ÖÌ壺´ó ÖРС | ÉÏһƪ | ÏÂһƪ | ÎÒҪͶ¸å

 ×÷Õߣºmfrbuaa    À´Ô´£º51TestingÈí¼þ²âÊÔÍø²É±à

·ÖÏí£º
¡¡¡¡´«Í³µÄ½â¾ö·½·¨
¡¡¡¡Í¨³£ÔÚ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();
}
32/3<123>
¼ÛÖµ398ÔªµÄ²âÊԿγÌÃâ·ÑÔùËÍ£¬ÌîÎʾíÁìÈ¡°É£¡

¹Ø×¢51Testing

ÁªÏµÎÒÃÇ

¿ì½ÝÃæ°å Õ¾µãµØͼ ÁªÏµÎÒÃÇ ¹ã¸æ·þÎñ ¹ØÓÚÎÒÃÇ Õ¾³¤Í³¼Æ

·¨ÂɹËÎÊ£ºÉϺ£äîϪÂÉʦÊÂÎñËù ÏîÆåÂÉʦ
°æȨËùÓÐ ÉϺ£²©Îª·åÈí¼þ¼¼Êõ¹É·ÝÓÐÏÞ¹«Ë¾ Copyright©51testing.com 2003-2022
ͶËß¼°Òâ¼û·´À¡£ºwebmaster@51testing.com; ÒµÎñÁªÏµ£ºservice@51testing.com 021-64471599-8017

»¦ICP±¸05003035ºÅ

»¦¹«Íø°²±¸ 31010102002173ºÅ