美文网首页
Java NIO系列1

Java NIO系列1

作者: 唐影若凡 | 来源:发表于2017-03-16 16:21 被阅读0次

    声明:原创文章,转载请注明出处。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

          本文链接:https://www.haomeiwen.com/subject/uazxgttx.html