Java NIO系列1

声明:原创文章,转载请注明出处。http://www.jianshu.com/u/e02df63eaa87

1、概述

Java BIO(标准IO)中, 提供了基于流的IO实现,即InputstreamOutputstream。也就是已字节为单位处理数据。

Java NIO是Java New IO的简称,是一套新的完全可以替代Java IO的机制。与BIO不同的是,NIO是基于块(Block)实现的,以块为基本单位处理数据。

除此之外,NIO还加入了以下特性:

  • Buffer:为所有的基本数据类型提供了Buffer支持
  • Charset:使用Java.nio.charset.Charset 作为字符集编码方案
  • Channel:增加Channel作为新的原始IO接口
  • 锁、内存映射:增加锁和内存映射的文件访问接口
  • selector:提供了基于selector的异步网络IO

Buffer是一块连续的内存块,是NIO读写数据的中转地。
Channel是缓冲数据的源头或目的地,用于向缓冲读取/写入数据,是访问Buffer的接口。

Channel和Buffer

2、Channel和Buffer

NIO中,Buffer为一个抽象类。并为每个基本数据类型创建了一个Buffer。除了ByteBuffer之外,其他基本类型的Buffer,都有完全相同的成员方法和操作。是由于ByteBuffer多用于大部分BIO操作的接口,具有一些特殊的方法。

NIO中,配合Buffer使用的有Channel。Channel与Stream最大的不同是,Channel是一个双向通道。使用NIO中,Channel不能单独使用,必须通过配合Buffer使用。例如,在对一个Channel进行读操作时,首先将数据从Channel写入到相应的Buffer中,之后在Buffer中进行读取。

public static void readAndWriteFile(String src, String dst) throws IOException {

        FileInputStream fis  = new FileInputStream(src);
        FileOutputStream fos = new FileOutputStream(dst);

        FileChannel readChannel  = fis.getChannel();
        FileChannel writeChannel = fos.getChannel();

        ByteBuffer buffer = ByteBuffer.allocate(1024); // 1KB

        while (true) {
            buffer.clear();
            int readLen = readChannel.read(buffer);
            if (readLen == -1) {
                break;
            }
            buffer.flip();
            writeChannel.write(buffer);
        }
        readChannel.close();
        writeChannel.close();
    }

上例是一个简单的使用NIO读取并写入的操作。可以看到,读取文件时,打开文件并获取文件的Channel,并将数据读入到空的Buffer中;同样地写入时,需要将有数据的Buffer写入到Channel中。对Channel进行读写操作时,都需要Buffer的配合。

你可能感兴趣的:(Java NIO系列1)