JDK1.4的java.niol.*包中引入了新的Java I/O类库,其目的在于提高速度,实际上,旧的I/O包已经使用nio重新实现过。以便充分利用这种速度提高。所以不用显式地nio编写代码,也能从中受益。速度的提高来自于所使用的结构更接近于操作系统执行I/O的方式:通道和缓冲器,我们并没有直接和通道进行交互。我们只和缓冲器交互,并把缓冲器派送到通道,所以,通道要么从缓冲器获得数据,要么向缓冲器发送数据。 在Nio中,缓冲器是ByteBuffer,从类名可以看出,这是个可以存储未加工字节的缓冲器,这是一个相当基础的类:通过告知分配多少存储空间来创建一个ByteBuffer对象,并且还有一个方法选择集,用于以原始的字节形式或基本数据类型输出和读取数据(注意字节,非对象或字符)。
在旧的I/O中有三个类被修改了,用于产生文件流通道FileChannel,这三个类是FileInputStream,FileOutputStream,以及用于既读又写的RandomAccessFile。都是字节操纵流,与底层的Nio性质一致。Reader和Writer这种字符模式类不能用于产生通道,但是在java.nio.channels.Channels类提供了实用方法,用以在通道中产生Reader和Writer。
想查看例子可翻看Thinking in Java 552页。
将一个通道和另外一个通道相连:transferTo(),transferFrom() 下面有一个用来实现文件复制的小程序
package com.minyi.file;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class TransferTo
{
public static void main(String[] args) throws IOException
{
//用于从文件读取信息
FileChannel in = new FileInputStream("E:\\minyi\\lianchi.txt")
.getChannel();
//用于将信息写至文件
FileChannel out = new FileOutputStream("E:\\minyi\\shenme.txt")
.getChannel();
//连接两个通道,将从lianchi.txt读取的字节文件放入到shenme.txt当中,实现文件复制。
in.transferTo(0, in.size(), out);
//分配1kb的存储空间来创建一个ByteBuffer对象
ByteBuffer buffer = ByteBuffer.allocate(1024);
//读入buffr缓冲器
in.read(buffer);
buffer.flip();
while (buffer.hasRemaining())
{
System.out.println((char) buffer.get());//可以使用asCharBuffer方法,但是得注意编码。
}
}
}
视图缓冲器(view buffer):从名字理解,这是一个可视的,意思就是我们可以通过具体的视图缓冲器知道我们该装入什么类型的数据。比如IntBuffer传入的就是Int类型的数据。
ByteBuffer依然是实际存储数据的地方。
package com.minyi.file;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
public class IntBufferDemo
{
//分配的存储空间
private static final int BSZIE=1024;
public static void main(String[] args)
{
//分配1KB存储空间创建ByteBuffer对象
ByteBuffer buffer=ByteBuffer.allocate(BSZIE);
//创建一个IntBuffer视图缓冲器
IntBuffer intBuffer=buffer.asIntBuffer();
//放入int数组
intBuffer.put(new int[]{45,89,65,26,5188});
System.out.println(intBuffer.get(2));
intBuffer.put(2,56);
intBuffer.flip();
while(intBuffer.hasRemaining())
{
int i=intBuffer.get();
System.out.println(i);
}
}
}