Java NIO 基础

news2025/1/17 2:56:28

Java NIO 基础

  • 1. NIO 介绍
  • 2. NIO 三大组件
    • 2.1 Channel
      • 2.1.1 常见的 Channel
      • 2.1.2 常用方法
    • 2.2 Buffer
      • 2.2.1 常见的 Buffer
      • 2.2.2 重要属性
      • 2.2.3 常用方法
    • 2.3 Selector
      • 2.3.1 四种事件类型

1. NIO 介绍

NIO(non-blocking io):非阻塞IO,JDK1.4 引入。

2. NIO 三大组件

2.1 Channel

Channer是读写数据的双向通道,类似于传统IO中的Stream,但是Stream只能单向操作。如:InputStream只能读操作,OutputStream只能写操作。

2.1.1 常见的 Channel

  • FileChannel:文件IO通道,用于文件的读写
  • DatagramChannel:UDP协议数据报通信
  • SocketChannel:网络套接字IO通道,TCP协议客户端
  • ServerSocketChannel:网络套接字IO通道,TCP协议服务端

2.1.2 常用方法

  • read(ByteBuffer buffer):从Channel中读取到ByteBuffer中,如果Channel中没有数据会一直堵塞到可读
  • read(ByteBuffer buffer,Long timeout):从Channel中读取到ByteBuffer中,超过时间会报错
  • write(ByteBuffer buffer):将数据写到Channel中,如果Channel中没有可写空间会一直堵塞到可写
  • write(ByteBuffer buffer, Long timeout):将数据写到Channel中,超过时间会报错
  • flush():将Channel中缓冲区数据刷到底层设备
  • register(Selector selector, SelectionKey key):将Channel注册到Selector
  • configureBlocking(boolean b):设置Channel是否为阻塞模式
  • socket():获取底层的Socket对象
  • isConnected():Channel是否已经连接上
  • isReadable():Channel是否可读
  • isWriteable():Channel是否可写
  • getRemoteAddress():Channel对应的远程地址
  • getLocalAddress():Channel对应的本地地址
  • open():Channel是否打开

2.2 Buffer

Buffer:缓冲读写数据,每一个Buffer对象关联一个字节数组。
在这里插入图片描述

2.2.1 常见的 Buffer

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

2.2.2 重要属性

  • capacity:Buffer所占的内存大小,设置后不能修改
  • limit:Buffer中可以操作的数据大小
  • position:下一个要读/写的数据索引
  • mark:标记当前position的位置,可以通过reset()position恢复到mark位置

2.2.3 常用方法

  • capacity():返回capacity的值
  • limit():返回limit的值
  • limit(int n):设置limit的值
  • position():返回position的值
  • position(int n): 设置position的值
  • mark():对Buffer做标记
  • reset():把position恢复到mark位置
  • rewind():设置position为0,取消mark标记
  • hasRemaining():判断Buffer中是否有元素
  • get():从Buffer中读取一个字节
  • get(byte[] b):从Buffer中读取多个字节
  • get(int index):从Buffer中读取指定索引位的字节
  • put(byte b):往Buffer中存一个字节
  • put(byte[] b):往Buffer中存多个字节
  • put(int index, byte b):往Buffer指定索引位存字节
  • clear():清空Buffer
  • compact():清空position之前的字节
  • flip():将limit设置为position的值,position设置为0

2.3 Selector

Selector配合一个线程管理多个Channel,获取Channel上发生的事件

2.3.1 四种事件类型

  • OP_CONNECT:连接成功后(只客户端使用)
  • OP_ACCEPT:客户端请求连接时(只服务端使用)
  • OP_READ:读缓冲区有可读数据时
  • OP_WRITE:写缓冲区有可写空间时
    在这里插入图片描述
package com.learn.wesay;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;

public class Server {
    public static void main(String[] args) throws IOException {
        // 创建Selector管理多个Channel
        Selector selector = Selector.open();

        // 创建服务端套接字通道
        ServerSocketChannel server = ServerSocketChannel.open();
        // 设置为非阻塞
        server.configureBlocking(false);
        // 绑定端口
        server.bind(new InetSocketAddress(8888));

        // Channel注册到Selector,只处理accept事件
        server.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            // 没有事件发生线程阻塞,有事件线程才会恢复运行
            selector.select();
            // 所有发生的事件
            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
            while (iterator.hasNext()) {
                SelectionKey selectionKey = iterator.next();
                if (selectionKey.isAcceptable()) {
                    handlerAccept(selectionKey, selector);
                }

                if (selectionKey.isReadable()) {
                    handlerRead(selectionKey, selector);
                }

                iterator.remove();
            }
        }

    }

    private static void handlerAccept(SelectionKey selectionKey, Selector selector) {
        ServerSocketChannel server = (ServerSocketChannel) selectionKey.channel();
        try {
            SocketChannel channel = server.accept();
            channel.configureBlocking(false);
            channel.register(selector, SelectionKey.OP_READ);
            System.out.println(channel);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static void handlerRead(SelectionKey selectionKey, Selector selector) {
        SocketChannel channel = (SocketChannel) selectionKey.channel();
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        try {
            int read = channel.read(byteBuffer);
            if (read == -1) {
                // 客户端socket正常断开
                selectionKey.cancel();
            } else {
                byteBuffer.flip();
                System.out.println(StandardCharsets.UTF_8.decode(byteBuffer));
            }
        } catch (IOException e) {
            // 客户端socket异常断开
            selectionKey.cancel();
        }
    }
}

public class Client {
    public static void main(String[] args) throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new InetSocketAddress("localhost", 8888));
        socketChannel.write(Charset.defaultCharset().encode("你好"));
    }
}

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

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

相关文章

2024.5.20 学习记录

1、react 原理&#xff08;jsx的本质、事件机制原理、setState和batch Update、组件渲染更新和diff算法、fiber&#xff09; 2、代码随想录贪心刷题

【C++初阶】--- C++入门(上)

目录 一、C的背景及简要介绍1.1 什么是C1.2 C发展史1.3 C的重要性 二、C关键字三、命名空间2.1 命名空间定义2.2 命名空间使用 四、C输入 & 输出 一、C的背景及简要介绍 1.1 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&…

GPT-4o 引领人机交互新风向的向量数据库Milvus Cloud 成本

成本 AIGC 时代对于冷热储存的呼唤 成本一直是向量数据库获得更广泛使用的最大阻碍之一,这个成本来自两点: 储存,绝大多数向量数据库为了保证低延迟,需要把数据全量缓存到内存或者本地磁盘。在这个动辄百亿量级的AI 时代,意味着几十上百 TB 的资源消耗。 计算,数据需…

OCR版面分析-- PaddleOCR(python 文档解析提取)

1. 创建新的conda环境 # 在命令行输入以下命令&#xff0c;创建名为paddle_env的环境 # 此处为加速下载&#xff0c;使用清华源 conda create --name paddle_env python3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令2. 激活刚创建…

全球视频会议软件巨头Zoom,率先引入后量子端到端加密

5月21日&#xff0c;Zoom Video Communications公司宣布&#xff0c;后量子端到端加密&#xff08;E2EE&#xff09;现已面向全球推出&#xff0c;适用于Zoom Workplace。目前&#xff0c;Zoom已将该功能加入Zoom Meetings&#xff0c;稍后将扩展至Zoom Phone和Zoom Rooms。 图…

数据中心大型AI模型网络需求

数据中心大型AI模型网络需求 随着Transformer的崛起和2023年ChatGPT的大规模应用&#xff0c;业界逐渐形成共识&#xff1a;遵循一定的规模效应原则&#xff0c;增加模型参数量能够显著提升模型性能。特别是在参数数量级跃升至数百亿乃至更高时&#xff0c;大型AI模型在语言理…

20232803 2023-2024-2 《网络攻防实践》实践十报告

目录 1. 实践内容1.1 SEED SQL注入攻击与防御实验1.2 SEED XSS跨站脚本攻击实验(Elgg) 2. 实践过程2.1 SEED SQL注入攻击与防御实验2.1.1 熟悉SQL语句2.1.2 对SELECT语句的SQL注入攻击2.1.3 对UPDATE语句的SQL注入攻击2.1.4 SQL对抗 2.2 SEED XSS跨站脚本攻击实验(Elgg)2.2.1 发…

超前预热|博睿数据将应邀出席双态IT用户大会,分享《构建云原生时代的一体化智能可观测性》

5月31日&#xff0c;第十二届双态IT用户大会将于成都盛大开幕&#xff0c;此次大会由DCMG和双态IT论坛联合主办&#xff0c;聚焦“信创时代的组织级云原生能力建设”和“组织级云原生运维能力建设”两大会议主题&#xff0c;旨在推动双态IT落地与创新&#xff0c;为企业数字化转…

Android AV World 序

序 做Android系统开发很久了&#xff0c;基于高通和MTK硬件平台&#xff0c;使用Android10量产了一些车载项目。由于功能模块属于系统底层支撑&#xff0c;类似于docker&#xff0c;涉及到音视频的处理&#xff0c;及Display Graphics的一些处理&#xff0c;需要调试解决显示花…

【map、set】C++用红黑树来封装map、set容器

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解map和set之用红黑树来封装map、set容器的相关内容。 如果看到最后您…

Star CCM+中边界模式交界面与接触模式交界面的生成差异

前言 前文已经介绍过将零部件分配至区域的方法与步骤&#xff0c;根据接触创建边界模式交界面与根据接触创建接触模式交界面两种交界面模式对初始化时间的影响。两者除了对初始化时间的影响差异外&#xff0c;其生成的边界面也是存在差异的。本文将对两者的生成的交界面的差异…

【BUG】Edge|联想电脑 Bing 搜索报错“Ref A: 乱码、 Ref B:乱码、Ref C: 日期” 的解决办法

文章目录 省流版前言解决办法 详细解释版前言问题描述与排查过程解决办法与总结 省流版 前言 我也不清楚咋滴了&#xff0c;Bing 搜索突然偶尔报错&#xff1a; 换了代理关了插件都报错。 参考&#xff1a; 我在用bing搜索时出现了如下代码&#xff0c;导致bing无法使用&am…

只需5步帮你有效监控员工上网记录

监控员工上网记录是企业实施网络管理、确保工作效率、保护信息安全和遵循合规要求的一种常见做法。这一过程通常涉及使用专业的上网行为管理软件&#xff0c;如安企神、域智盾等&#xff0c;这些软件具备多样化的功能来帮助企业管理者有效地监控和控制员工的上网行为。以下是监…

【Java基础】IO流(4) —— 转换流、打印流

【Java基础】IO流(1) —— 简介 【Java基础】IO流(2) —— 字符流 【Java基础】IO流(3) —— 字节流 【Java基础】IO流(4) —— 转换流、打印流 【Java基础】IO流(5) —— 序列流、内存流 【Java基础】IO流(6) —— 随机访问文件流、数据流 转换流 InputStreamReader 是字节输…

DataGrip测试连接时出现报错解决方案

&#xff08;一&#xff09;报错情况描述&#xff1a; DBMS: MySQL (无版本) 区分大小写: 普通形式mixed&#xff0c;分隔形式exact Connection refused: connect. &#xff08;二&#xff09;解决方案&#xff1a; 1、 首先打开命令指示符&#xff0c;选择以管理员身份运行。…

在排序数组中查找元素的第一个位置和最后一个位置 ---- 二分查找

题目链接 题目: 分析: 如果我们查找元素的第一个位置, 随便假设一个位置为x, 如果这个数>target, 说明 [left,x-1] 是我们要找的位置, [x,right] 可以舍去, 让right mid-1,如果这个数target, 说明[left,x] 是我们要找的位置, [x1,right] 可以舍去, 让right mid,(因为当…

做抖音小店不想赔钱,这几个功能必须关掉!

大家好&#xff0c;我是电商糖果 有很多新手刚开始运营店铺&#xff0c;对店铺的有些设置并不了解。 前期将所有的设置都打开了&#xff0c;等到店铺出单之后&#xff0c;才发现麻烦一大堆。 这里糖果就跟自己开店的经验&#xff0c;劝告各位新手朋友&#xff0c;这几个功能…

数据仓库实验四:聚类分析实验

目录 一、实验目的二、实验内容和要求三、实验步骤1、建立数据表2、建立数据源视图3、建立挖掘结构Student.dmm4、部署项目并浏览结果5、挖掘模型预测 四、实验结果分析五、实验总结体会 一、实验目的 通过本实验&#xff0c;进一步理解基于划分的、基于层次的、基于密度的聚类…

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

实物演示效果 基于stm32智能鱼缸控制系统的设计与实现 目录&#xff1a; 实物演示效果 目录&#xff1a; 一、 绪论 1.1 项目研究目的及意义 1.1.1 选题目的 1.1.2 选题意义 1.2 国内外研究现状 1.2.1 国外发展现状 1.2.2 国内发展现状 1.3 项目研究内容 二、智能鱼缸系统总体设…