Java NIO 基础

devtools/2024/12/23 5:22:01/

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:写缓冲区有可写空间时
    在这里插入图片描述
java">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管理多个ChannelSelector 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();}}
}
java">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.ppmy.cn/devtools/42282.html

相关文章

JavaScript身份三要素认证API、身份证二要素实名认证接口

996这种工作模式&#xff0c;试问有多少人愿意接受&#xff1f;然而这种工作制度在程序员的圈子里早已成为不成文的“规定”。网络段子也有不少调侃程序员的&#xff0c;比如&#xff1a;一程序员去面试&#xff0c;面试官问&#xff1a;“你毕业才两年&#xff0c;这三年工作经…

MySQL之Schema与数据类型优化(三)

Schema与数据类型优化 BLOB和TEXT类型 BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型&#xff0c;分别采用二进制和字符方式存储。 实际上它们分别属于两组不同的数据类型家族:字符类型是TINYTEXT&#xff0c;SMALLTEXT,TEXT&#xff0c;MEDIUMTEXT&#xff0c;LONG…

深入理解数仓开发(二)数据技术篇之数据同步

1、数据同步 数据同步我们之前在数仓当中使用了多种工具&#xff0c;比如使用 Flume 将日志文件从服务器采集到 Kafka&#xff0c;再通过 Flume 将 Kafka 中的数据采集到 HDFS。使用 MaxWell 实时监听 MySQL 的 binlog 日志&#xff0c;并将采集到的变更日志&#xff08;json 格…

解决法律条文的录入前判断发条冲突的需求;怎么选择NLPModel?怎么使用模型?

要在NLPModel类中实现法律条文的冲突检测功能&#xff0c;可以使用BERT模型来计算句子相似度。以下是详细的步骤&#xff0c;包括如何选择模型、训练模型以及使用模型。 选择NLP模型 根据你的需求&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Tra…

React项目知识积累(二)

1.document.querySelectorAll() document.querySelectorAll() 是 JavaScript 中的一个内置方法&#xff0c;用于选择多个元素并返回一个 NodeList 对象。 const nodeList document.querySelectorAll(selector); selector&#xff1a;一个字符串&#xff0c;用于指定要选择的…

MobaXterm使用私钥远程登陆linux

秘钥的形式使用MobaXterm 远程连接 linux 服务器 MobaXterm使用私钥远程登陆linux just填写远程主机 不指定用户 勾选使用私钥 选择私钥即可 1.使用秘钥连接 远程linux 服务器的好处 只需要第一次添加秘钥&#xff0c;并输入密码后&#xff0c;以后再连接就不需要再输入密码…

后量子密码解决方案

什么是后量子密码学 (PQC)&#xff0c;为什么准备工作如此重要? 量子计算正在迅速发展;用不了多久&#xff0c;量子网络攻击就会成为可能。量子网络攻击将能够在几分钟内瘫痪大型网络。我们今天赖以保护我们的连接和交易的一切都将受到量子计算机的威胁&#xff0c;危及所有密…

vLLM部署qwen大模型加速推理实现

目录 step1: 编写 vllm_wrapper.py step2: 应用场景&#xff1a;给体检指标生成健康建议 step1: 编写 vllm_wrapper.py from transformers import PreTrainedTokenizer, GenerationConfig, StoppingCriteriaList from typing import Optional, Callable, List, Tuple, Union…