No.one: 什么是NIO?
新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O就是NIO.
No.two:理解:
讲得很抽象吧? 我们来理解一下, 以前我们使用的IO都是以流的形式读取数据, 流读取的原理是一次一个字节地读数据,一个输入流产生和一个字节的数据, 一个输出流消费一个字节的数据. 缺点: 速度慢, 优点: 过滤非常容易.
现在, NIO的出现弥补了这个缺点, 面向块 的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。 注: 块是以字节数组读取数据的. 流是以字节读取数据的, 想想, 是不是快了不止一个级别.其次NIO不能代替原有的IO,只能相互弥补, 就跟AOP和OOP 一样.
No.three:NIO原理和API:
在NIO中, 我们读和些的数据都是放在Buffer中, 读数据先通过通道加载到Buffer中, 写入的数据也是如此, 我们所说的Buffer 实际上时一个数组, 一个字节(byte)数组 , 注意 : 一个Buffer不仅仅是一个数组, 缓冲区提供了对数据的结构化访问.
最常用的缓冲区类型是ByteBuffer,一个 ByteBuffer 可以在其底层字节数组上进行 get/set 操作(即字节的获取和设置)。
ByteBuffer不是 NIO 中唯一的缓冲区类型。事实上,对于每一种基本 Java 类型都有一缓冲区类型,例:
ByteBuffer
CharBuffer
ShortBuffer
IntBufferLongBuffer
FloatBuffer
DoubleBuffer
但我们通常使用ByteBuffer就够了.
好了, 闲话少说, 下面是以个文件复制的例子:
CopFIle.java
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
/**
* 使用Nio实现文件复制
* @author 神
*/
public class CopyFile {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String fileone = "f:/fileone.txt" ;
String filetwo = "f:/filetwo.txt" ;
//将文件加载到字节流中
FileInputStream fin = new FileInputStream(fileone);
//要输出的目标文件
FileOutputStream fout = new FileOutputStream(filetwo);
//得到nio对象
FileChannel fcin = fin.getChannel() ;
FileChannel fcout =fout.getChannel() ;
//开辟一个1024大小的缓冲
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(true){
buffer.clear() ;
int i = fcin.read(buffer) ;
if(i == -1){
break ;
}
//准备写到输出块中
buffer.flip() ;
//将fileone.txt中的内容写到filetwo.txt中
fcout.write( buffer );
}
fin.close();
fcin.close();
fout.close();
fcout.close() ;
}
}