一、NIO与传统IO
JDK1.4引入了新的IO(NIO),它与传统的IO主要的区别在于,NIO是面向块(缓存区),而传统的IO是面向流的,传统的IO是阻塞的,而NIO可以实现非阻塞,NIO的其他特性有内存映射文件、文件锁定、字符集编码和解码等
二、核心部分
NIO的核心组件包括:Channel、Buffer和Selector,其他如:Pipe和FileLock可以看成是NIO的工具类
Channel:NIO中有4种Channel,分别是
- FileChannel : 用于文件的读写
- SocketChannel :用于TCP读取网络数据
- ServerSocketChannel : 可以监听新连接的TCP,像Web服务器一样,每个新进来的连接都会创建一个SocketChannel
- DatagramChannel :用于UDP读取网络数据
Channel类似传统IO中的流(Stream),但是与流的不同之处在于:
- 流是单向传输的,比如文件读入流FileInputStream,对应有文件写出流FileOutputStream,但是NIO中的Channel是双向的,FileChannel既可以读入,也可以写出;
- 传统的IO中我们是直接操作流对象,进行读入和写出 ,但是在NIO中我们直接操作的对象不在是类似流的Channel,而是相应的Buffer;
- 传统IO的读写需同步,是阻塞的,而NIO中Channel可以异步读写。
Buffer : NIO中主要提供了8中Buffer,分别是
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
- MappedbyteBuffer (用于内存映射文件)
缓冲区(Buffer)实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。
利用通道(Channel)和缓存区(Buffer)就可以实现简单的NIO文件读写。
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class SimpleRW {
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("e:\\test.txt");
FileChannel channel = fis.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(128);
int n = channel.read(buffer);
while(n != -1) {
System.out.println("Read:" + n);
buffer.flip();
while(buffer.hasRemaining()) {
System.out.print((char)buffer.getChar());
}
buffer.clear();
n = channel.read(buffer);
}
fis.close();
}
}