Netty(三)- NIO三大组件之Channel

news2024/10/7 8:29:05

文章目录

  • 一、Channel 基本介绍
  • 二、FileChannel 类
  • 三、Channel 应用案例
    • 1. 应用实例 1 - 本地文件写数据
    • 2. 应用实例 2 - 本地文件读数据
    • 3. 应用实例 3 - 使用一个Buffer 完成文件读取、写入
    • 4. 应用实例 4 - 拷贝文件transferFrom方法

一、Channel 基本介绍

  1. NIO的通道类似于流,但有些区别如下:
    通道可以同时进行读写,而流只能读或者只能写;
    通道可以实现异步读写数据;
    通道可以从缓冲区读数据,也可以写数据到缓冲区;
    在这里插入图片描述
  2. BIO 中的 stream 是单向的,例如 FileInputStream 对象只能进行读取数据的操作,而 NIO 中的Channel(通道)是双向的,可以读操作,也可以写操作 ;
  3. Channel在NIO中是一个接口
    public interface Channel extends Closeable{}
  4. 常用的 Channel 类有:FileChannel、DatagramChannel、ServerSocketChannel 和 SocketChannel;【ServerSocketChanne 类似 ServerSocket , SocketChannel 类似 Socket】
  5. FileChannel 用于文件的数据读写,DatagramChannel 用于 UDP 的数据读写,ServerSocketChannel 和 SocketChannel 用于 TCP 的数据读写;

二、FileChannel 类

FileChannel 主要用来对本地文件进行 IO 操作,常见的方法有:

// 站在Buffer角度看,read in 数据到Buffer,从Bufferwrite out Channel
public int read(ByteBuffer dst) //从通道读取数据并放到缓冲区中
public int write(ByteBuffer src) //把缓冲区的数据写到通道中
public long transferFrom(ReadableByteChannel src, long position, long count) //从目标通道中复制数据到当前通道
public long transferTo(long position, long count, WritableByteChannel target) //把数据从当前通道复制给目标通道

三、Channel 应用案例

1. 应用实例 1 - 本地文件写数据

实例要求:
(1)用 ByteBuffer(缓冲) 和 FileChannel(通道), 将 “hello,你好” 写入到 file01.txt 中;
(2)文件不存在就创建;

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

public class NIOFileChannel01 {
    public static void main(String[] args) throws Exception{

        String str = "hello,你好";
        // 创建一个输出流
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\GitHub\\NettyDemo\\file01.txt");

        // 通过 fileOutputStream 获取对应的 FileChannel
        // 这个 fileChannel 真实类型是 FileChannelImpl
        FileChannel fileChannel = fileOutputStream.getChannel();

        // 创建一个缓冲区 ByteBuffer
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

        // 将 str 放入 byteBuffer
        byteBuffer.put(str.getBytes());

        // 对byteBuffer 进行flip
        byteBuffer.flip();

        // 将byteBuffer 数据写到 fileChannel
        fileChannel.write(byteBuffer);
        fileOutputStream.close();

    }
}

2. 应用实例 2 - 本地文件读数据

(1)使用 ByteBuffer(缓冲) 和 FileChannel(通道), 将 file01.txt 中的数据读入到程序,并显示在控制台;
(2)假定文件已经存在;

public class NIOFileChannel02 {
    public static void main(String[] args) throws Exception {

        // 创建文件的输入流
        File file = new File("D:\\GitHub\\NettyDemo\\file01.txt");
        FileInputStream fileInputStream = new FileInputStream(file);

        // 通过fileInputStream 获取对应的FileChannel -> 实际类型  FileChannelImpl
        FileChannel fileChannel = fileInputStream.getChannel();

        // 创建缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate((int) file.length());

        // 将通道的数据读入到Buffer
        fileChannel.read(byteBuffer);

        // 将byteBuffer 的字节数据 转成String
        System.out.println(new String(byteBuffer.array()));
        fileInputStream.close();

    }
}

输出:

hello,你好

3. 应用实例 3 - 使用一个Buffer 完成文件读取、写入

实例要求:
(1)使用 FileChannel(通道) 和 方法 read 、 write,完成文件的拷贝;
(2)拷贝一个文本文件 file01.txt , 放在项目下即可;

在这里插入图片描述

public class NIOFileChannel03 {
    public static void main(String[] args) throws Exception {

        FileInputStream fileInputStream = new FileInputStream("1.txt");
        FileChannel fileChannel01 = fileInputStream.getChannel();

        FileOutputStream fileOutputStream = new FileOutputStream("2.txt");
        FileChannel fileChannel02 = fileOutputStream.getChannel();

        ByteBuffer byteBuffer = ByteBuffer.allocate(512);

        // 循环读取
        while (true) {

            // 这里有一个重要的操作,一定不要忘了
            /*public Buffer clear() { // clear源码
		       position = 0;
		        limit = capacity;
		        mark = -1;
		        return this;
		    }*/
            // 清空buffer
            // 如果不clear,此时position=limit,则read的返回值为0,退不出循环,还会一直重复写
            byteBuffer.clear();
            int read = fileChannel01.read(byteBuffer);
            System.out.println("read = " + read);
            // 表示读完
            if(read == -1) {
                break;
            }
            // 将buffer 中的数据写入到 fileChannel02 -- 2.txt
            byteBuffer.flip();
            fileChannel02.write(byteBuffer);
        }

        // 关闭相关的流
        fileInputStream.close();
        fileOutputStream.close();
    }
}

4. 应用实例 4 - 拷贝文件transferFrom方法

实例要求:
(1)使用 FileChannel(通道) 和 transferFrom方法,完成文件的拷贝;
(2)拷贝一张图片;

public class NIOFileChannel04 {
    public static void main(String[] args)  throws Exception {
        // 创建相关流
        FileInputStream fileInputStream = new FileInputStream("D:\\GitHub\\NettyDemo\\a.png");
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\GitHub\\NettyDemo\\a2.png");

        // 获取各个流对应的fileChannel
        FileChannel sourceChannel = fileInputStream.getChannel();
        FileChannel destChannel = fileOutputStream.getChannel();

        // 使用transferForm完成拷贝
        destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
        // 关闭相关通道和流
        sourceChannel.close();
        destChannel.close();
        fileInputStream.close();
        fileOutputStream.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis:自定义映射resultMap(7)

Mybaits笔记框架:https://blog.csdn.net/qq_43751200/article/details/128154837 自定义映射resultMap1. Mybatis环境搭建2. 问题引入3. 解决表中的字段名和对应类的属性名不一致问题方式一: 为字段起别名,保持和属性名的一致方式二&#xff…

html静态网站基于HTML+CSS+JavaScript上海美食介绍网站网页设计与实现共计5个页面

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

K邻近算法k值选取以及kd树概念、原理、构建方法、最近邻域搜索和案例分析

一、k值选择 K值过小:容易受到异常点的影响k值过大:受到样本均衡的问题 近似误差:对现有训练集的训练误差,关注训练集,如果近似误差过小可能会出现过拟合的现象,对现有的训练集能有很好的预测,…

基于RockyLinux8.7一键安装OpenStack Yoga版本

硬件环境 虚拟软件:vmware workstation16 操作系统:RockyLinux8 虚拟机硬件配置: CPU:2 memory:8G disk:80G net card:1个—VMnet8 ip/netmask:192.168.9.160/24 下载并安装RockyL…

python:最小二乘法拟合原理及代码实现

这里写目录标题原理代码实现原理 最小二乘法适用于对处理的一堆数据,不必精确的经过每一点,而是根据图像到每个数据点的距离和最小确定函数。需要注意的是,最小二乘是对全局进行拟合优化,对噪声比较敏感,所以如果有噪…

知识点7--Docker的容器命令

本篇为大家介绍Docker的容器命令,也顺带着让大家明白Docker和vmware都属于虚拟化技术下的软件,但是他们的不同之处不止在于运行的系统不同,他们的运行逻辑也不同,VMware是虚拟化完整的系统,而docker是隔离一个进程&…

03 - 调试环境的搭建(Bochs)(实验未完)

---- 整理自狄泰软件唐佐林老师课程 1. Bochs(另一款优秀的虚拟机软件) 专业模拟x86架构的虚拟机 开源且高度可移植,由C编写完成 支持操作系统开发过程中的断点调试 通过简单配置就能运行绝大多数主流的操作系统 2. Bochs的安装与配置 下载…

数字化升级里,RPA的下一步正在走向哪?

如果说,API这种能力在2021年并未成为“刚需”,那么在2022年其已经一跃成为RPA进入企业真正场景的“必需品”。 作者|斗斗 编辑|皮爷 出品|产业家 今年八月,调查机构Gartner发布了2022全球RPA魔力象限。 数据显示,2021年&a…

空间直接坐标系(XYZ)转经纬度(BLH)

本章首先介绍空间直角坐标系与大地坐标系,然后列出XYZ转换BLH的公式,最后基于C语言完成该部分代码设计。 参考书籍: 董大男,陈俊平,王解先等,GNSS高精度定位原理,科学出版社 黄丁发,…

图扑软件荣获第七届“创客中国”中小企业创新创业大赛优胜奖

2022 年 11 月 17 日,由工业和信息化部、财政部共同主办的第七届“创客中国”中小企业创新创业大赛全国总决赛在浙江杭州落下帷幕。 本次《第七届“创客中国”中小企业创新创业大赛》举办目的,意在加大优质中小企业梯度培育力度,进一步提升中…

高新技术企业如何规划

如何提高申报高企的成功率,应该是很多企业关心的一个问题。 2022年高新技术企业申报已经结束,今年第三批申报的企业结果也将公示,有客户会问,历年来你们申报高企通过率这么高,是怎么做到的? 那么现在呢&a…

《痞子衡嵌入式半月刊》 第 66 期

痞子衡嵌入式半月刊: 第 66 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢…

Spring 框架下如何调用kafka

1、Spring 项目代码结构如下: 2、数据库资源配置文件如下: #sql配置文件 spring.datasource.driver-class-namecom.microsoft.sqlserver.jdbc.SQLServerDriver #.19為測試地址,.13為正式地址 spring.datasource.urljdbc:sqlserver://172.12.…

[ 红队知识库 ] 常见防火墙(WAF)拦截页面

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu交叉编译Arm Linux环境下的身份证读卡器so库操作步骤

1、配置环境变量 ①将gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar解压至/home/eastcoms/ sudo或者root运行命令 :sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar -C /home/eastcoms .tar用 -xvf .gz用 -zxvf .bz2用 -jxvf …

easypoi导入案例

文章目录easypoi导入案例一、依赖二、导出模板1、excel模板实体类(同下)2、具体实现类3、easypoi工具类中的方法4、自定义样式类三、导入校验1、excel模板实体类2、具体实现类3、自定义信号导入校验类easypoi导入案例 一、依赖 <dependency><groupId>cn.afterturn…

第7 部分 HDLC 和PPP

路由器经常用于构建广域网&#xff0c;广域网链路的封装和以太网上的封装有着非常大的差别。常见的广域网封装有HDLC&#xff0c;PPP 和Frame-relay 等&#xff0c;本次介绍HDLC 和PPP。相对而言&#xff0c;PPP 比HDLC 有较多的功能。 7.1 HDLC 和PPP 简介 7.1.1 HDLC 介绍 H…

批处理及有状态等应用类型在 K8S 上应该如何配置?

众所周知, Kubernetes(K8S)更适合运行无状态应用, 但是除了无状态应用. 我们还会有很多其他应用类型, 如: 有状态应用, 批处理, 监控代理(每台主机上都得跑), 更复杂的应用(如:hadoop 生态...). 那么这些应用可以在 K8S 上运行么? 如何配置? 其实, K8S 针对这些都有对应的不…

操作系统:存储器管理 练习题(带有详细答案解析)

文章目录1.存储器的层次结构2.程序的装入和链接2.1.程序的装入2.2.程序的链接3.连续分配存储管理方式3.1.单一连续分配3.2.固定分区分配3.3.动态分区分配3.4.基于顺序搜索的动态分区分配算法3.5.基于索引搜索的动态分区分配算法3.6.动态可重定位分区分配4.对换4.1.多道程序环境…

SBT 树原理和实战

一 基本概念 SBT&#xff08;Size Balanced Tree&#xff0c;节点大小平衡树&#xff09;是一种自平衡二叉查找树&#xff0c;通过子树的大小来保持平衡。与红黑树、AVL 树等自平衡二叉查找树相比&#xff0c;SBT更易于实现。SBT 可以在 O (logn) 时间内完成所有二叉搜索树的相…