最近同学给我说NIO中读和写和开始学IO感觉一样,一会儿InputString,一会OutputString,经常搞不清楚这个输入和输出到底哪个对应哪个。我自己想了一个记这个的方法,分享给刚学NIO的同学,可以让你记得非常清楚。
先贴一段别人的程序:
public void test1(){//10874-10953
long start = System.currentTimeMillis();
FileInputStream fis = null;
FileOutputStream fos = null;
//①获取通道
FileChannel inChannel = null;
FileChannel outChannel = null;
try {
fis = new FileInputStream("d:/1.mkv");
fos = new FileOutputStream("d:/2.mkv");
inChannel = fis.getChannel();
outChannel = fos.getChannel();
//②分配指定大小的缓冲区
ByteBuffer buf = ByteBuffer.allocate(1024);
//③将通道中的数据存入缓冲区中
while(inChannel.read(buf) != -1){
buf.flip(); //切换读取数据的模式
//④将缓冲区中的数据写入通道中
outChannel.write(buf);
buf.clear(); //清空缓冲区
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(outChannel != null){
try {
outChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inChannel != null){
try {
inChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
long end = System.currentTimeMillis();
上面的 inChannel.read(buf),如何记才不容易混淆,按我的方法来:
inChannel调用的read方法
将 inChannel.read(buf) 反着看 buf read inChannel,直译过来:缓冲区读通道,就是缓冲区读通道的另一端,在上面代码块中就是读文件。
同样的,outChannel.write(buf)反过来看,buf write outChannel:缓冲区写入通道,就是把缓冲区写到通道的另一端,在上面的代码块中就是写文件。
这样记就非常好记了,尤其是刚学IO/NIO 读入输入让人很容易记混淆。
然后还有一个混淆的就是 buf.flip(); //切换读取数据的模式
这是buf调用的flip对吧,我觉得应该flip应该叫切换到buf数据被读模式,其实就是把buf里的数据输出的开关打开了。既然大家都把调用flip叫读模式,那我就把flip记成读
同样的反过来看 flip buf:读缓冲区。 这样就代表,buf现在被通道读的开关打开了。这样记就轻松多了,分享给同学,同学觉得非常好记。于是分享给大家~~