Java NIO介绍

发展史

按照使用的 IO 模型,大致可以分为三类:

  • BIO:JDK1.4 之前的阻塞 IO
  • NIO:JDK1.4 及以后的版本,非阻塞 IO
  • AIO:JDK1.7 之后,又叫 NIO.2,异步 IO

IO 总的来说分为两个阶段,第一阶段是等待数据到达内核缓冲区,第二阶段是将数据从内核缓冲区复制到用户缓冲区。

Java NIO

Java NIO 是 java 1.4, 之后新出的一套IO接口NIO中的N可以理解为Non-blocking,不单纯是New。

NIO的特性/NIO与IO区别

1)IO是面向流的,NIO是面向缓冲区的;
2)IO流是阻塞的,NIO流是不阻塞的;
3)NIO有选择器,而IO没有。

读数据和写数据方式

  • 从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。

  • 从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

NIO核心组件简单介绍

Java NIO的三大核心组件是Channel(通道)、Buffer(缓冲区)、Selector(选择器)。其中,通道和缓冲区的联系比较密切:数据总是从通道读到缓冲区内,或者从缓冲区写入通道中。

Java NIO里关键的Buffer实现

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

例子

package com.sto.nio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author yanyugang
 * @description
 * 实例说明:实现文件复制功能
 * 实现方式:通道FileChannel、 缓冲区ByteBuffer
 * @date 2019-09-12 15:15
 */
public class NioTest {
    public static void main(String[] args) throws IOException{
        // 设置输入源 & 输出地 = 文件
        String infile="d:/knowledge.txt";
        String outfile="d:/hello.txt";

        // 1. 获取数据源 和 目标传输地的输入输出流(此处以数据源 = 文件为例)
        FileInputStream fin=new FileInputStream(infile);
        FileOutputStream fout=new FileOutputStream(outfile);

        // 2. 获取数据源的输入输出通道
        FileChannel fcin=fin.getChannel();
        FileChannel fcout=fout.getChannel();

        // 3. 创建缓冲区对象
        ByteBuffer buff=ByteBuffer.allocate(1024);

        while (true) {
            // 4. 从通道读取数据 & 写入到缓冲区
            // 注:若 以读取到该通道数据的末尾,则返回-1
            int r=fcin.read(buff);
            if (r==-1){
                break;
            }
            // 5. 传出数据准备:调用flip()方法
            buff.flip();

            // 6. 从 Buffer 中读取数据 & 传出数据到通道
            fcout.write(buff);

            // 7. 重置缓冲区
            buff.clear();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值