NIO归纳总结以及FileChannel使用

NIO

问题1: 什么是NIO?

NIO,其实是在讨论一个IO的问题,就是数据以流的方式输入输出的事件,然后衍生出的BIO,NIO,AIO 就是只以一种什么样的方式去完成数据输出输入.

概念名词中文翻译(1)

BIO :同步阻塞

NIO:同步非阻塞

AIO: 异步非阻塞

概念名词关键字解释(2)

以上会出现两组名词:同步与异步,阻塞与非阻塞(以下解释是本人理解的,若有不准确可以留言斧正)

同步&异步:

发起调度任务的人,需不需要等待返回结果.

同步的话,我先等到一个返回结果后,再继续运行后面的代码. 若是异步的话,我触发了这个方法,不需要等待返回结果直接返回后面的代码

阻塞&非阻塞:

被调用方是不是马上返回结果

阻塞的话,被调用方接受到请求后,要等自己的方法(代码)完成后才返回结果.

非阻塞的话,被调用方马上返回数据表示自己的状态,不管是完成或者未完成.

总结:

上面章节,简单介绍了以及理清了一些关键字概念以及说明,再用大白话去总结BIO,NIO,AIO.

用A,B表示调用方以及被调用方.

BIO:A 调用 B的方法后,A要等待B返回预期结果后,A再继续执行本身的代码

NIO:A 调用 B的方法后,A接收了B返回的结果(不需要等待,且结果不一定是预期值,例如返回一些未完成的状态值),继续执行本身代码

AIO:A 调用 B的方法后,继续执行本身代码,B有结果了,会使用事件通知A

 

实战

如何把读文件/写文件?

本demo把读,写文件步骤糅合一起展示,显示简单的基本操作示范

        //读入文件
        RandomAccessFile infile = new RandomAccessFile("C:\\Users\\25245\\Desktop\\testInFile.txt","rw");
        //读出文件
        RandomAccessFile outfile = new RandomAccessFile("C:\\Users\\25245\\Desktop\\testOutFile.txt","rw");
        //获取管道
        FileChannel inChannel = infile.getChannel();
        FileChannel outChannel = outfile.getChannel();
        try {
            //获取区块
            ByteBuffer bigBuffer = ByteBuffer.allocate(1024*1024);
​
            //读取数据
            while(inChannel.read(bigBuffer) != -1){
                //把读取的区块,游标位置反转,当需要从该区块中写出数据的话
                bigBuffer.flip();
                //判断区块中是否还有数据
                while(bigBuffer.hasRemaining()){
                    //获取对应的一个字节
                    outChannel.write(bigBuffer);
                }
                bigBuffer.clear();
            }
            bigBuffer.clear();
        }finally {
            infile.close();
            outfile.close();
            inChannel.close();
            outChannel.close();
        }
​
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用Java NIO模型中的FileChannel实现文件复制的代码实现: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileCopyDemo { public static void main(String[] args) throws Exception { FileInputStream inputStream = new FileInputStream("source.txt"); FileChannel inputChannel = inputStream.getChannel(); FileOutputStream outputStream = new FileOutputStream("target.txt"); FileChannel outputChannel = outputStream.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while (inputChannel.read(buffer) != -1) { buffer.flip(); outputChannel.write(buffer); buffer.clear(); } inputChannel.close(); outputChannel.close(); inputStream.close(); outputStream.close(); System.out.println("File copied successfully!"); } } ``` 以上代码中,我们首先定义了一个FileInputStream对象,并通过调用getChannel()法创建一个FileChannel对象来进行文件读取。接着我们定义了一个FileOutputStream对象,并通过调用getChannel()法创建一个FileChannel对象来进行文件写入。 然后我们使用allocate()法创建一个1024字节大小的ByteBuffer对象。在while循环中,我们不断从inputChannel中读取数据到buffer中,然后将buffer的position设置为0,limit设置为buffer的当前position,接着通过write()法将buffer中的数据写入到outputChannel中。 最后,我们需要关闭输入输出流和FileChannel对象,并输出文件复制成功的提示信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值