java中的NIO通道Channel[65]

java中的NIO通道Channel[64]




一、Channel

Channel:

New IO通道:Channel是一个对象,可以通过它读取和写入数据,拿NIO与原来的IO作比较,通道就像是流;

所有数据都通过Buffer对象来处理,永远不会将字节直接写入通道中,数据会先写入包含一个或者多个字节的缓冲区,也不可以直接从通道中读取字节,而是将数据从通道中读入缓冲区,再从缓冲区获取数据字节;

二、内存映射代码演示

方案1:

private static void NewCopyFile(){
    try {
        //创建一个文件操作输入流,r是读模式
        RandomAccessFile rafIn=new RandomAccessFile("D:/files/test1.txt","r");
        //创建一个文件输出流,rw是输出模式
        RandomAccessFile rafOUt=new RandomAccessFile("D:/files/Random.txt","rw");

        //创建一个文件输入通道
        FileChannel fcIN=rafIn.getChannel();
        //创建一个文件输出通道
        FileChannel fcOut=rafOUt.getChannel();
        //输入流的字节大小
        long size=fcIN.size();
        //输入流缓冲区,FileChannel.MapMode.READ_ONLY表示读取数据字节,0表示从第0个开始,size表示设置此次数据长度
        MappedByteBuffer mpIn=fcIN.map(FileChannel.MapMode.READ_ONLY,0,size);
        //输出流缓冲区,FileChannel.MapMode.READ_WRITE表示写入数据字节,0表示开始位置,size表示数据长度
        MappedByteBuffer mpOut=fcOut.map(FileChannel.MapMode.READ_WRITE,0,size);

        for (int i=0;i<size;i++){
            //循环将数据写入文件缓冲区
            mpOut.put(mpIn.get(i));
        }
        //关闭通道时会写入数据块
        fcIN.close();
        fcOut.close();
        System.out.println("Success");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

方案2:

private static void OldCopyFile(){
   try {
       //创建一个输入文件的通道
       FileChannel fcIn=new FileInputStream("D:/files/test1.txt").getChannel();
       //创建一个输出文件的通道
       FileChannel fcOut=new FileOutputStream("D:/files/Chan.txt").getChannel();
       //初始化缓冲区流,并设置长度
       ByteBuffer buf=ByteBuffer.allocate(1024);
       while (fcIn.read(buf)!=-1){
           //文件反转
           buf.flip();
           //写入文件中
           fcOut.write(buf);
           //关闭缓冲区
           buf.clear();
       }
       //关闭管道
       fcIn.close();
       fcOut.close();
       System.out.println("SUCCESS");
   } catch (FileNotFoundException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   }
}

三.IO操作性能对比排序

1.内存映射最快(通道+缓冲区);
2.NIO读写文件;
3.使用了带缓存的IO流;
3.无缓存的IO流;

四.小结

本章对java中的NIO通道流进行概述和演示,内存映射是文件操作中性能最快,效率最高的IO操作流,可在开发中选择性使用;
有哪里不足或者有更好的建议,欢迎留言吐槽,有哪里不懂的小伙伴,可以私信我,我会一一答复,感谢认可,感谢支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道而起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值