java NIO基础知识

不同于IO的流,NIO是通过块的方式来传输数据的。

面向流 的IO系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。

面向块 的NIO系统以块的形式处理数据。这些数据都放在下面所说的缓冲(buffer)中

NIO的两个重要概念:

  1. 通道(Channel)是对原IO中流的模拟,读出或写入Buffer中的数据都要通过一个Channel对象,常用的channel类型有FileChannel,DatagramChannel(UDP),SocketChannel(TCP),ServerSocketChannel(TCP)
  2. 缓冲(Buffer)是一个对象,包含程序需要读出或写入的数据,NIO中所有数据都通过 Buffer 对象来处理,也就是任何时候访问NIO中的数据的时候,数据都是在Buffer中的。缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。最常用的缓冲区类型是ByteBuffer。

Buffer内部结构

一个 buffer 用三个值指定缓冲区在任意时刻的状态

  • position(指向下一个读取或写入的元素的索引)
  • limit(表明还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)
  • capacity(是buffer所包含的元素的最大数量,不能为负且不能更改)

大小关系. 0 <= position <= limit <= capacity

说的不清,具体请看 这里

buffer的几个重要方法

  • flip() 将写模式转换成读模式,是在把数据写入到通道前调用,它做了两件重要的事1.将limit设置为当前position,2.将position设置为0
  • clear() 清空缓冲区,也了两件重要的事1.将limit设置为capacity,2.将position设置为0,调用该方法后,就可以从buffer中重新读取数据了.
  • rewind() 重新读取buffer中的数据,limit不变,position 设为0
  • mark(), reset(),mark()设置一个标志,reset()将position重置到该位置

Channel和Buffer配合读写文件

读文件(不是从Buffer中读,是把文件中的数据读到Buffer中)

  1. 创建一个FileInputStream 并获取Channel对象
    FileChannel fcin = new FileInputStream("f:/in.txt").getChannel();
  2. 创建Buffer
    ByteBuffer buffer = ByteBuffer.allocate(1024)
  3. 将数据通过通道中读取到buffer,
    fcin.read(buffer)

写文件,跟读文件类似,只是将第三步改为fcout.write(buffer)。


NIO 复制文件示例

public class CopyFile {
    public static void main(String args[]) throws IOException{
        // 获取读写文件通道
        FileChannel fcin = new FileInputStream("f:/in.txt").getChannel();
        FileChannel fout = new FileOutputStream("f:/out.txt").getChannel();
        // 创建缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        
        while (true){
            // clear方法清空缓冲区,将limit设置为capacity,position设置为0
            buffer.clear();  
            // 从通道中将数据读到缓冲区, 返回读取的字节数  
            int r = fcin.read(buffer);
            // 如果r == -1, 说明已到达流的末尾, 没有数据可读
            if (r == -1){
                break;
            }
            // 将写模式转换成读模式,将limit设置为当前position,position设置为0
            buffer.flip();
            fout.write(buffer);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值