- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java NIO总结
NIO:与外围设备数据通信需要channel通道,如像外部输出数据,先将数据写入缓冲区通过通道输出。如果从外部读取数据,需要通过通道channel读取到缓冲区,然后从缓冲区数据获取处理。缓冲区内部细节1 初始化2 第一次读取3个字节到缓冲区3 第二次读取2个字节到缓冲区4 调用Flip,将limit设置position,position设置为0 5 调用clear,将limit设置为capacity,position设置为0NIO核心观念:通道和缓冲区(channel和Buffer)块操作非阻塞IO复用机制采用select模型,注册感兴趣IO事件给操作系统后,一旦这些事件发生,内核会改变这些事件的状态,通过检查这些事件的状态,便可以查找到注册过的、准备就绪的I/O 事件,然后可以流畅地进行I/O操作。传统IO阻塞调用:流I/O 是阻塞调用的。不论是read 方法还是write 方法都能阻塞(block)一个线程直到字节被真正地读取或者写入。这意味着如果流不能立即被读取或者写入字节(通常是因为网络连接繁忙),Java 就会挂起这个调用的线程,处于等待的状态。常用Socket 的读写操作都是阻塞式的,就是说每次read/write 掉用,在数据被读入/写出前,调用线程都处于阻塞的状态.多线程耗费资源,特别是多线程间切换很耗费资源。NIO特征:l)面向块的I/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 对象扔给连接池。之后用户处理线程可以去做别的事情,比如,向其他连接池发送请求。最后当用户线程处理完能做的业务逻辑后,就可以等待连接池返回结果了。读写IO:(按块缓冲区)package java.nio.io;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java.util.Date;/** * @Project: NIO * @Title: CopyFile.java * @Package * @Description: JAVA NIO 读取写入文件方面优势 * @author paul.wei2011@ * @date May 16, 2013 9:51:13 AM * @version V1.0 *///传统IO一直是性能瓶颈,因为每次按字节读取,耗费磁头寻址次数,磁头寻址时间是固定的,次数多耗费时间就长publicclass CopyFile {publicstaticvoid main(String[] args) throws Exception { String infile = C:\\copy.sql; String outfile = C:\\copy.txt; // 获取源文件和目标文件的输入输出流 FileInputStream fin = new FileInputStream(infile); FileOutputStream fout = new FileOutputStream(outfile); // 获取输入输出通道 FileChannel fcin = fin.getChannel();//FileChannel对象是线程安全的 FileChannel fcout = fout.getChannel(); // 每个FileChannel都有一个叫file position的概念,该position值决定文件中哪一处的数据接下来被读或写。// FileChannel position是从底层文件描述符获取的,当字节被read( ) 或write( ) 方法传输时,文件position会自动更新。// MappedByteBuffer类使得我们可以通过ByteBuffer API来访问数据文件byteBuff
文档评论(0)