关于Buffer和Channel的注意事项和细节

1.举例

package org.example.demo;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.RandomAccess;/*** MappedByteBuffer可以让文件直接在内存中(堆外内存)修改,操作系统不需要拷贝一次* @author hrui* @date 2024/7/28 15:22*/
public class MappedByteBufferTest {public static void main(String[] args) throws IOException {RandomAccessFile rw = new RandomAccessFile("D:\\1.txt", "rw");//获取对应的通道FileChannel channel = rw.getChannel();/*** 参数1: FileChannel.MapMode.READ_WRITE,使用读写模式* 参数2: 0,可以直接修改的起始位置* 参数3: 5,映射到内存的大小(不是索引位置,即将1.txt映射到内存的字节个数)* 映射多少个字节,映射多少个字节就修改多少个字节*/MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);mappedByteBuffer.put(0, (byte) 'H');mappedByteBuffer.put(3, (byte) '9');//mappedByteBuffer.put(5, (byte) '9');//IndexOutOfBoundsExceptionrw.close();}
}

2.举例  将Buffer转成只读Buffer 

package org.example.demo;import java.nio.ByteBuffer;/*** 将Buffer转成只读Buffer* @author hrui* @date 2024/7/28 14:32*/
public class ReadOnlyBuffer {public static void main(String[] args) {//创建一个BufferByteBuffer buffer = ByteBuffer.allocate(64);for (int i = 0; i < 64; i++) {buffer.put((byte) i);}buffer.flip();//将buffer转成只读BufferByteBuffer readOnlyBuffer = buffer.asReadOnlyBuffer();System.out.println(readOnlyBuffer.getClass());//class java.nio.HeapByteBufferRwhile (readOnlyBuffer.hasRemaining()) {System.out.println(readOnlyBuffer.get());}readOnlyBuffer.put((byte) 100);//抛出ReadOnlyBufferException}
}

3.举例  NIO提供了MappedByteBuffer,可以让文件直接在内存(堆外的内存)中进行修改

而如何同步到文件由NIO来完成

package org.example.demo;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.RandomAccess;/*** MappedByteBuffer可以让文件直接在内存中(堆外内存)修改,操作系统不需要拷贝一次* @author hrui* @date 2024/7/28 15:22*/
public class MappedByteBufferTest {public static void main(String[] args) throws IOException {RandomAccessFile rw = new RandomAccessFile("D:\\1.txt", "rw");//获取对应的通道FileChannel channel = rw.getChannel();/*** 参数1: FileChannel.MapMode.READ_WRITE,使用读写模式* 参数2: 0,可以直接修改的起始位置* 参数3: 5,映射到内存的大小(不是索引位置,即将1.txt映射到内存的字节个数)* 映射多少个字节,映射多少个字节就修改多少个字节*/MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);mappedByteBuffer.put(0, (byte) 'H');mappedByteBuffer.put(3, (byte) '9');rw.close();}
}

4.举例,前面都是通过一个Buffer完成的,NIO还支持通过多个Buffer(即Buffer数组)完成读写操作

即Scattering(分散)和Gathering(聚合)

package org.example.demo;import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Arrays;/*** Scattering:(分散)将数据写入到Buffer时,可以采用Buffer数组,分散的将数据写入到各个Buffer中* Gathering:(聚集)将数据从Buffer读取到数据时,可以采用Buffer数组,聚集的将数据从多个Buffer中读取* @author hrui* @date 2024/7/28 15:36*/
public class ScatteringAndGatheringTest {public static void main(String[] args) throws IOException {//前面一直用文件通道,这里用ServerSocketChannelServerSocketChannel open = ServerSocketChannel.open();InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 9999);//绑定端口到Socket,并启动open.socket().bind(inetSocketAddress);//创建Buffer数组ByteBuffer[] byteBuffers = new ByteBuffer[2];byteBuffers[0] = ByteBuffer.allocate(5);byteBuffers[1] = ByteBuffer.allocate(3);//等待客户端连接System.out.println("等待客户端连接...");SocketChannel socketChannel = open.accept();int messageLength = 8;while (true) {int read = 0;while (read < messageLength) {long l = socketChannel.read(byteBuffers);read += l;System.out.println("read=" + read);//使用流打印,看看每个buffer的position和limitArrays.stream(byteBuffers).map(buffer -> "position=" + buffer.position() + ",limit=" + buffer.limit()).forEach(System.out::println);Arrays.asList(byteBuffers).forEach(buffer -> buffer.flip());//将buffer数据写入到fileChannellong l1 = 0;while (l1 < messageLength) {long l2 = socketChannel.write(byteBuffers);l1 += l2;}//将所有的buffer进行clearArrays.asList(byteBuffers).forEach(buffer -> buffer.clear());}}}
}

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

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

相关文章

动量参数(Momentum Parameter)

动量参数&#xff08;Momentum Parameter&#xff09;在机器学习中指的是一种用于加速梯度下降算法的技术&#xff0c;特别是深度学习中优化神经网络权重时。简单来说&#xff0c;动量参数是一种帮助优化过程加速并减少震荡的技术。 具体来说&#xff0c;动量参数具有以下特点…

网络编程——wireshark抓包、tcp粘包

目录 一、前言 1.1 什么是粘包 1.2 为什么UDP不会粘包 二、编写程序 文件树 客户端程序 服务器程序 tcp程序 头文件 makefile 三、 实验现象 四、改进实验 五、小作业 一、前言 最近在做网络芯片的驱动&#xff0c;验证功能的时候需要借助wireshark这个工具&…

猫头虎分享:Numpy知识点一文带你详细学习np.random.randn()

&#x1f42f; 猫头虎分享&#xff1a;Numpy知识点一文带你详细学习np.random.randn() 摘要 Numpy 是数据科学和机器学习领域中不可或缺的工具。在本篇文章中&#xff0c;我们将深入探讨 np.random.randn()&#xff0c;一个用于生成标准正态分布的强大函数。通过详细的代码示…

Android Studio 一键删除 Recent Projects信息的方法

Android Studio打开项目多了就一堆最近项目的记录&#xff0c;在IDE里面只能一个个手动删除。 File - Recent Projects 解决方案&#xff1a;修改配置文件 Note&#xff1a;方法不唯一。 Android Studio 存储了一个包含最近打开项目信息的配置文件。通过手动编辑或删除recentP…

科普文:kubernets原理

kubernetes 已经成为容器编排领域的王者&#xff0c;它是基于容器的集群编排引擎&#xff0c;具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 本文将带着大家快速了解 kubernetes &#xff0c;了解我们谈论 kubernetes 都是在谈论什么。 一、背…

详细介绍BIO、NIO、IO多路复用(select、poll、epoll)

BIO、NIO、IO多路复用 BIO(Blocking IO)NIO(Non-blocking IO) 同步非阻塞IOIO多路复用selectpollepoll Redis的IO多路复用 BIO(Blocking IO) 最基础的IO模型&#xff0c;当进行IO操作时&#xff0c;线程会被阻塞&#xff0c;直到操作完成。 比如read和write&#xff0c;通常IO…

Python的输入规则

Python的输入特别有意思&#xff0c;它和C的输入不一样&#xff0c;它的输入的原型是类似于C的string类型&#xff0c;但是对于一些有意思的算法题来说&#xff0c;光是读入string型的内容并不容易解题&#xff0c;于是我们可以从两个方面来将输入给转化。 1. 先使用函数input…

SGLang 大模型推理框架 qwen2部署使用案例;openai接口调用、requests调用

参考: https://github.com/sgl-project/sglang 纯python写,号称比vllm、tensorRT还快 暂时支持模型 安装 可以pip、源码、docker安装,这里用的pip 注意flashinfer安装最新版,不然会可能出错误ImportError: cannot import name ‘top_k_top_p_sampling_from_probs’ fr…

EtherNet/IP转Profinet协议网关(经典配置案例)

怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题&#xff0c;作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为JM-PN-EIP&#xff0c;下面是详细介绍。 一&#xff0c;设备主要功能 1、捷米特J…

nodepad++已打开的文件怎么按照字母/文字顺序排列?

nodepad已打开的文件怎么按照字母/文字顺序排列&#xff1f; 点击菜单栏 “窗口” -> “排序方式” &#xff08;可选择升序或降序&#xff09;

加密货币赋能跨境电商:PayPal供应链金融服务如何引领行业新趋势

跨境电商行业近年来呈现出爆发式增长&#xff0c;随着全球化贸易壁垒的降低和数字经济的快速发展&#xff0c;越来越多的商家和消费者跨越国界进行交易。根据eMarketer的数据&#xff0c;全球跨境电商交易额在2023年已超过4万亿美元&#xff0c;并预计在未来几年内仍将保持两位…

centos7 xtrabackup mysql(8)增量备份(1)

centos7 xtrabackup mysql&#xff08;8&#xff09;增量备份&#xff08;1&#xff09; 参考 xtrabackup-8.0的安装、备份以及恢复&#xff08;innoxtrabackup有待测试&#xff09; https://blog.csdn.net/DWJRIVER/article/details/117792271 https://blog.csdn.net/qq_28…

开发环境搭建——Tomcat安装配置

一、Tomcat安装 1、解压下载好的安装包&#xff0c;将解压后的文件放到任意一个盘中&#xff0c;注意&#xff0c;尽量不要有中文 2、运行Tomcat&#xff0c;测试Tomcat是否正常连接使用 双击bin目录下的startup.bat文件&#xff0c;启动Tomcat 出现下面的界面标识Tomcat启动…

顺序栈和链栈的操作实现

目录 一. 前言 二.顺序栈 三. 链栈 一. 前言 简而言之&#xff0c;顺序栈就是栈的顺序存储&#xff0c;链栈就是栈的链式存储。 二.顺序栈 下面我们来看下顺序栈的结构定义&#xff1a; typedef char SElemType; #define MAXSIZE 100 typedef struct{SElemType * base; //…

使用git命令行的方式,将本地项目上传到远程仓库

在国内的开发环境中&#xff0c;git的使用是必不可少的。Git 是一款分布式版本控制系统&#xff0c;用于有效管理和追踪文件的变更历史及协作开发。本片文章就来介绍一下怎样使用git命令行的方式&#xff0c;将本地项目上传到远程仓库&#xff0c;虽然现在的IDE中基本都配置了g…

SPI 通信协议

文章目录 一 简介二 特点三 接口四 时钟极性和时钟相位五 优缺点 一 简介 ​ SPI (Serial Perripheral Interface)&#xff0c;是由 Motorola 公司推出的一种高速、全双工的总线协议。SPI 采用主从方式工作&#xff0c;一般由 SCLK、CS、MOSI、MISO 四根线组成&#xff0c;主机…

DNS劫持实验

实验背景 利用ettercap进行DNS欺骗&#xff0c;攻击者冒充域名服务器&#xff0c;也就是把查询的IP地址设为攻击者 的IP地址&#xff0c;这样用户上网就只能看到攻击者设计的网页。 实验设备 一个网络 net:cloud0 一台模拟黑客主机 kali 一台靶机 windows 主机 实验拓扑 …

机器学习之人脸识别-使用 scikit-learn 和人工神经网络进行高效人脸识别

文章摘要 本文将介绍如何使用 Python 的 scikit-learn 库和人工神经网络&#xff08;ANN&#xff09;来识别人脸。我们将使用 LFW 数据集&#xff08;Labeled Faces in the Wild&#xff09;&#xff0c;这是一个广泛用于人脸识别基准测试的大型人脸数据库。我们将展示如何准备…

【微软蓝屏】构建更加稳固和安全的网络环境:从“微软蓝屏”事件谈起

最近&#xff0c;那个让全球都头疼的“微软蓝屏”事件&#xff0c;简直就像是科技界的一场大地震。你说这背后的原因&#xff0c;竟然是一个软件更新的小失误&#xff1f;哎呀&#xff0c;这可真是让人哭笑不得。不过&#xff0c;笑归笑&#xff0c;这事儿也给我们提了个醒&…

nodejs - express 学习笔记

express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c;官方网址&#xff1a;https://www.expressjs. com.cn/ 简单来说&#xff0c;express 是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发 WEB 应用&#xff08;HTTP 服务&am…