JDK1,.4的java.nio.*包中引入了新的JavaI/O类库,其目的在于提高速度。实际上,旧的I/O包已经使用nio重新实现过,以便利用这种速度提高,因此,即使我们不显示的调用nio编写代码,也能从中受益。速度的提高在文件I/O和网络I/O中都有可能发生。
速度的提高来自于所使用的的结构更接近于操作系统执行I/O的方式:通道和缓冲器。唯一直接与通道交互的缓冲器是ByteBuffer--也就是说,可以存储未加工字节的缓冲器。查询JDK文档时(java.nio.ByteBuffer),会发现他是一个相当基础的类:通过告知分配多少存储空间来创建一个ByteBuffer对象,并且还有一个方法选择集,用于以原始的字节形式或基本数据类型输出读取数据。但是,没办法输出或读取对象,即使是字符串对象也不行。这种处理虽然很低级,但却正好,因为这是大多数操作系统中更有效的映射方式。
旧I/O类库中有是三个类被修改,用以产生FileChannel。这三个被修改的类是FileInputStream、FileOutputStream以及用于既读又写的RandomAccessFile。注意这些是字节操作流,与低层的nio性质一致。Reader和Writer这种字符模式类不能用于产生通道;但是java.nio.channels.Channels类提供了实用的方法;用以在通道中产生Reader和Writer.
public class GetChannel { public static final int BSIZE=1024; public static void main(String[] args) throws Exception{ FileChannel fc=new FileOutputStream("data.txt").getChannel(); fc.write(ByteBuffer.wrap("Some text".getBytes())); fc.close(); fc=new RandomAccessFile("data.txt","rw").getChannel(); fc.position(fc.size());//Move to the end fc.write(ByteBuffer.wrap("Some more".getBytes())); fc.close(); //Read the file fc=new FileInputStream("data.txt").getChannel(); ByteBuffer buffer=ByteBuffer.allocate(BSIZE); fc.read(buffer); buffer.flip(); while (buffer.hasRemaining()) System.out.println((char)buffer.get()); } }