- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1.???基本?概念
IO?是主存和外部设备?(?硬盘、终端和网络等?)?拷贝数据的过程。?IO?是操作系统的底层功能实现,底层通过?I/O?指令进行完成。
所有语言运行时系统提供执行?I/O?较高级别的工具。?(c?的?printf scanf,java?的面向对象封装?)
2.????Java?标准?io?回顾
Java?标准?IO?类库是?io?面向对象的一种抽象。基于本地方法的底层实现,我们无须关注底层实现。InputStream\OutputStream(?字节流?)?:一次传送一个字节。?Reader\Writer(?字符流?)?:一次一个字符。
3.????nio?简介
nio?是?java New IO?的简称,在?jdk1.4?里提供的新?api?。?Sun?官方标榜的特性如下:
–?????为所有的原始类型提供?(Buffer)?缓存支持。
–?????字符集编码解码解决方案。
–?????Channel?:一个新的原始?I/O?抽象。
–?????支持锁和内存映射文件的文件访问接口。
–?????提供多路?(non-bloking)?非阻塞式的高伸缩性网络?I/O?。
本文将围绕这几个特性进行学习和介绍。
4.???BufferChanel
Channel?和?buffer?是?NIO?是两个最基本的数据类型抽象。
Buffer:
–????????是一块连续的内存块。
–????????是?NIO?数据读或写的中转地。
Channel:
–????????数据的源头或者数据的目的地
–????????用于向?buffer?提供数据或者读取?buffer?数据?,buffer?对象的唯一接口。
–?????????异步?I/O?支持
图1:channel和buffer关系?
?
例子?1:CopyFile.java:
Java代码??
package?sample;??
??
import?java.io.FileInputStream;??
import?java.io.FileOutputStream;??
import?java.nio.ByteBuffer;??
import?java.nio.channels.FileChannel;??
??
public?class?CopyFile?{??
????public?static?void?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?fcout?=?fout.getChannel();??
????????//?创建缓冲区??
????????ByteBuffer?buffer?=?ByteBuffer.allocate(1024);??
????????while?(true)?{??
????????????//?clear方法重设缓冲区,使它可以接受读入的数据??
????????????buffer.clear();??
????????????//?从输入通道中将数据读到缓冲区??
????????????int?r?=?fcin.read(buffer);??
????????????//?read方法返回读取的字节数,可能为零,如果该通道已到达流的末尾,则返回-1??
????????????if?(r?==?-1)?{??
????????????????break;??
????????????}??
????????????//?flip方法让缓冲区可以将新读入的数据写入另一个通道??
????????????buffer.flip();??
????????????//?从输出通道中将数据写入缓冲区??
????????????fcout.write(buffer);??
????????}??
????}??
}??
?
其中?buffer?内部结构如下?(?下图拷贝自资料?):
图2:buffer内部结构?
一个?buffer?主要
文档评论(0)