同步非阻塞I/O——NIO(一)基于文件操作

新的输入/输出(NIO)实在JDK1.4中引入的,NIO弥补了原来的IO的不足,它在Java中提供了高速的、面向块的I/O。在前面的两篇文章中介绍的那些同步并阻塞式I/O都是基于流的方式来完成的,通过一个成为Stream的对象一次移动一个字节。NIO与原来的IO有相同的目的与作用,但是它们的使用方式不同,NIO是基于块的。按块处理数据要比按字节处理数据快的多。

通道(Channel)和缓冲区(Buffer)

通道和缓冲区是NIO的核心对象,几乎每一个NIO都要使用他们。

通道是用于向缓冲读取或者写入数据,是对原来的I/O中的流的模拟,只是流是单向的,而通道是双向的。缓冲区是一块连续的内存块,是NIO读取数据的中转池,在NIO库中,所有的数据都是用缓冲处理的,在读取数据时,它是直接读入到缓冲区的,在写入数据时,也是直接写入到缓冲区的。

通道的实现类有FileChannle、SocketChannel以及ServerSocketChannel等。

对于每一个基本的java类型都有一个缓冲区类型,其中使用的最为常见的即为ByteBuffer。

向文件中写入信息和从文件中读取信息:

向文件中写入信息的步骤: (1) 获取通道 (2) 创建缓冲区 (3) 将数据写入缓冲区

从文件中读取信息的步骤: (1) 获取通道 (2) 创建缓冲区 (3) 将数据从channnel读到缓冲区

具体的文件的读写操作示例代码如下:

package nio;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 产生可写的,可读可写的以及可读的通道
 */
public class GetChannel {
	private static final int BSIZE = 1024;
	public static void main(String[] args) throws IOException {
		FileOutputStream fos = new FileOutputStream("data.txt");
		FileChannel fc = fos.getChannel();
		fc.write(ByteBuffer.wrap("Some text".getBytes()));
		fc.close();
		fos.close();
		//read
		FileInputStream fis = new FileInputStream("data.txt");
		fc = fis.getChannel();
		ByteBuffer buff = ByteBuffer.allocate(BSIZE);
		fc.read(buff);
		buff.flip();
		while(buff.hasRemaining()){
			System.out.print((char)buff.get());
		}
		fc.close();
		fis.close();
	}
}
flip() 方法让缓冲区可以将新读入的数据写入另一个通道。

你可能感兴趣的:(同步非阻塞I/O——NIO(一)基于文件操作)