欢迎来到天天文库
浏览记录
ID:42623729
大小:67.54 KB
页数:16页
时间:2019-09-19
《Java NIO总结》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、NIO:与外围设备数据通信需要channel通道,如像外部输出数据,先将数据写入缓冲区通过通道输出。如果从外部读取数据,需要通过通道channel读取到缓冲区,然后从缓冲区数据获取处理。缓冲区内部细节1初始化2第一次读取3个字节到缓冲区3第二次读取2个字节到缓冲区4调用Flip,将limit设置position,position设置为05调用clear,将limit设置为capacity,position设置为0NIO核心观念:通道和缓冲区(channel和Buffer)1)块操作2)非阻塞IO复用机制采用select模型,注册感兴趣IO事件给操作系统后,一旦这些事件发
2、生,内核会改变这些事件的状态,通过检查这些事件的状态,便可以查找到注册过的、准备就绪的I/O事件,然后可以流畅地进行I/O操作。传统IO阻塞调用:流I/O是阻塞调用的。不论是read方法还是write方法都能阻塞(block)一个线程直到字节被真正地读取或者写入。这意味着如果流不能立即被读取或者写入字节(通常是因为网络连接繁忙),Java就会挂起这个调用的线程,处于等待的状态。常用Socket的读写操作都是阻塞式的,就是说每次read/write掉用,在数据被读入/写出前,调用线程都处于阻塞的状态.多线程耗费资源,特别是多线程间切换很耗费资源。NIO特征:l)面向块的I
3、/O操作2)非阻塞的I/O操作3)字符集编码解码4)内存映射文件5)文件锁定,Reactor模型:Reactor模型采用分而治之的思想,将一个客户端连接的事件分成两类:I/O事件和非I/O事件。前者需要等待I/O准备就绪,后者可以立即执行,因此分别进行处理。I/O事件包括:Read(读取请求信息)、Send(发送响应信息)。非I/O事件包括encode、compute、decode。异步连接池:首先,用户处理线程调用连接池对象的某个方法(比如sendRequest),把一个能够标识本次请求的Request对象扔给连接池。之后用户处理线程可以去做别的事情,比如,向其他连接
4、池发送请求。最后当用户线程处理完能做的业务逻辑后,就可以等待连接池返回结果了。(一)读写IO:(按块缓冲区)packagejava.nio.io;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.nio.ByteBuffer;importjava.nio.MappedByteBuffer;importjava.nio.channels.FileChannel;importjava.util.Date;/***@Project:
5、NIO*@Title:CopyFile.java*@Package*@Description:JAVANIO读取写入文件方面优势*@authorpaul.wei2011@gmail.com*@dateMay16,20139:51:13AM*@versionV1.0*///传统IO一直是性能瓶颈,因为每次按字节读取,耗费磁头寻址次数,磁头寻址时间是固定的,次数多耗费时间就长publicclassCopyFile{publicstaticvoidmain(String[]args)throwsException{Stringinfile="C:\copy.sql";Str
6、ingoutfile="C:\copy.txt";//获取源文件和目标文件的输入输出流FileInputStreamfin=newFileInputStream(infile);FileOutputStreamfout=newFileOutputStream(outfile);//获取输入输出通道FileChannelfcin=fin.getChannel();//FileChannel对象是线程安全的FileChannelfcout=fout.getChannel();//每个FileChannel都有一个叫'fileposition'的概念,该position值决
7、定文件中哪一处的数据接下来被读或写。//FileChannelposition是从底层文件描述符获取的,当字节被read()或write()方法传输时,文件position会自动更新。//MappedByteBuffer类使得我们可以通过ByteBufferAPI来访问数据文件byteBuffer(fcin,fcout);//2秒mapByteBuffer(fcin,fcout);//1秒}//创建缓冲区publicstaticvoidbyteBuffer(FileChannelfcin,FileChannelfcout)throwsIO
此文档下载收益归作者所有