我来说说Java的NIO

发表于:2011-11-09 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:focusJ(cnblogs)    来源:51Testing软件测试网采编

  步骤三:开始进行文件备份工作。

       while(true) {
//准备向Buffer中写入数据-->相当于点燃烟丝,完事具备只欠东风
buffer.clear();

//进行字符编码 -->相当于水的过滤作用
CharBuffer cb = decoder.decode(buffer);
ByteBuffer bb = encoder.encode(cb);

//数据经过编码以后暂存缓冲区-->相当于经过水过滤后的烟暂停在水斗中
int t = inFc.read(bb);
if(t == -1) {
break;
}

bb.flip();

//将字节码写入目标文件-->相当于烟已经进入到嘴里
outFc.write(bb);
}

  步骤四:检查文件是否备份成功。发现C盘下面多了一个wk-bak.txt的文件,内容与wk.txt一摸一样。接下来享受java带给你的快感....

  上面的例子估计大家已经理解的差不多了,当然如果深究也会有一些不太妥当的地方,但是不要较真,目的是学习NIO,并不是吸烟。如果感觉你可以了那么就请把上面的例子补充完整,运行一下,享受一下NIO的威武(当然字符编码并不是必须的,只是让这个例子显得完整一点)。

  好吧如果你理解了上面的东西,并且真正的补全了文件备份的小程序,那么就来进行稍微深入一点的学习吧。

  上文我提到了举吸烟的例子是有欠妥当的,其中之一就是Buffer的内部机制和"水斗"简单的过滤功能是不一样的。还有字符编码那一块也不是在Buffer内部实现的东西,decoder和encoder是针对Buffer的两个工具。那我们接下来分析一下Buffer内部机制到底不一样在哪里呢(主要分析常用的两个方法;clear(),flip())?

  来吧,打开Buffer的源码(摘取有用的部分):

public abstract class Buffer {

// Invariants: mark <= position <= limit <= capacity
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;

public final Buffer clear() {
position = 0;
limit = capacity;
mark = -1;
return this;
}

public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}

  首先我们要明确一点,所谓的缓冲器仅仅是一个“多功能”的数组。可能在这个Buffer类中没有体现,但是如果我们打开ByteBuffer的源码会有byte[]的数组,打开CharBuffer的源码会有char[]的数组。因为Buffer是所有缓冲器的父类,所以他它不能预计会有多少种缓冲器,所以索性让“儿子”们自己实现去吧。

  既然知道了缓冲器是一个“多功能的数组”,那么我们用画图的形式来分析一下上面Buffer的源码。

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号