NIO之Buffer操作示例
1. buffer常规操作 略
2. 只读buffer
/**
* 只读buffer
*/
public class BufferTest01 {
public static void main(String[] args) {
IntBuffer buffer = IntBuffer.allocate(10); for (int i = 0; i < 10; i++) {
buffer.put(i);
} buffer.flip();
// 这个buffer1只能读
IntBuffer buffer1 = buffer.asReadOnlyBuffer(); for (int i = 0; i < 10; i++) {
System.out.println(buffer.get());
} // 如果再往buffer1中put数据,则会报错ReadOnlyBufferException
buffer1.put(10); }
}
3. 映射buffer
/**
* MappedByteBuffer 可以让文件直接在堆外内存中修改,这样操作系统不需要拷贝一次
*/
public class MappedByteBufferTest02 {
public static void main(String[] args) throws Exception {
RandomAccessFile file = new RandomAccessFile("1.txt", "rw");
// 获取对应的文件通道
FileChannel channel = file.getChannel();
/*
*FileChannel.MapMode.READ_WRITE: 表示是读写模式
* 0 : 可以修改的起始位置
* 5 : 我映射到内存的大小(不是索引), 即可以将文件1.txt的5个字节映射到内存, 你映射多少个字节 ,就可以修改多少个字节,
*/
MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
mappedByteBuffer.put(0, (byte) 'A');// 将第一个位置改成A
mappedByteBuffer.put(4, (byte) 'B'); //将第五个位置改成B file.close(); }
}
4. 分散与聚合
/**
* scattering : 将数据写入到buffer时,可以采用buffer数组 ,依次写入
* gathering : 从buffer读取数据时,可以采用buffer数组 ,依次读
*/
public class ScatteringAndGatheringTest {
public static void main(String[] args) throws Exception { // 使用ServerSocketChannel和SocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
InetSocketAddress socketAddress = new InetSocketAddress(8888);
// 绑定端口到socket上,并启动socket服务
serverSocketChannel.socket().bind(socketAddress); ByteBuffer[] buffers = new ByteBuffer[2];
buffers[0] = ByteBuffer.allocate(5);
buffers[1] = ByteBuffer.allocate(3);
int total = 8;
// 等待客户端的连接
System.out.println("等待连接。。。。。");
SocketChannel socketChannel = serverSocketChannel.accept(); // 循环读取数据
while (true) {
int byteRead = 0;
while (byteRead < 8) {
long read = socketChannel.read(buffers);
byteRead += read;
System.out.println("已读取:" + byteRead);
// 流打印, 看看当前buffer的position和limit
Arrays.asList(buffers).stream().map(x -> "position=" + x.position() + ", limit = " + x.limit()).forEach(System.out::println);
} // 切换
Arrays.asList(buffers).forEach(x -> x.flip());
// 将读取出来的数据显示到客户端
long byteWrite = 0;
while (byteRead < total) {
long l = socketChannel.write(buffers);
byteWrite += l;
} // 复位操作 Arrays.asList(buffers).stream().map(x -> x.clear()); System.out.println("byteRead = " + byteRead + ", byteWrite = " + byteWrite + ", total =" + total); }
}
}
NIO之Buffer操作示例的更多相关文章
- NIO之FileChannel操作示例
1. 写文件操作 /** * 写文件 */ public class FileChannelTest { public static void main(String[] args) throws I ...
- Java NIO:Buffer、Channel 和 Selector
Buffer 一个 Buffer 本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据. java.nio 定义了以下几个 Buffer 的实现,这个图读者应该也在不少地方见过了吧 ...
- C#文件的拆分与合并操作示例
C#文件的拆分与合并操作示例代码. 全局变量定义 ;//文件大小 //拆分.合并的文件数 int count; FileInfo splitFile; string splitFliePath; Fi ...
- Java NIO 之 Buffer
Java NIO 之 Buffer Java NIO (Non Blocking IO 或者 New IO)是一种非阻塞IO的实现.NIO通过Channel.Buffer.Selector几个组件的协 ...
- phpExcel 操作示例
片段 1 片段 2 phpExcel 操作示例 <?php //写excel //Include class require_once('Classes/PHPExcel.php'); requ ...
- Netty快速入门(03)Java NIO 介绍-Buffer
NIO 介绍 NIO,可以说是New IO,也可以说是non-blocking IO,具体怎么解释都可以. NIO 1是在JSR51里面定义的,在JDK1.4中引入,因为BolckingIO不支持高并 ...
- java-redis集合数据操作示例(三)
redis系列博文,redis连接管理类的代码请跳转查看<java-redis字符类数据操作示例(一)>. 一.集合类型缓存测试类 public class SetTest { /** * ...
- java-redis列表数据操作示例(二)
接上篇博文<java-redis字符类数据操作示例(一)>,redis连接管理类的代码请跳转查看. 一.列表类型缓存测试类 public class ListTest { /** * 主测 ...
- 文件操作示例脚本 tcl
linux 下,经常会对用到文件操作,下面是一个用 tcl 写的文件操作示例脚本: 其中 set f01 [open "fix.tcl" w] 命令表示 打开或者新建一个文件“fi ...
随机推荐
- leetcode 36有效的数独
建立一个哈希表,每次查找,如果对应的列col,行row,小方格box中的数出现第二次,那么数独不合法: 据说还有深度优先搜索的方法,表示没有听懂:) class Solution { public: ...
- tjuthesis 图标题左对齐修改办法
图标题格式默认是居中的. 将 format 文件里定义图表标题样式部分的 \centering 删去,可变为左对齐. 如下: %% 定制浮动图形和表格标题样式\makeatletter\long\de ...
- ES6模块与CommonJS模块的差异
ES6模块与CommonJS模块的差异 讨论 Node 加载 ES6模块之前,必须了解 ES6模块与 CommonJS模块完全不同. 它们有两个重大差异. CommonJS模块输出的是一个值的拷贝,E ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_12-对象数组
对象数组是怎么回事呢? 新建Person类 代码生成后续的代码 生成一个无参构造 两个成员变量都选上,这是全参构造 生成getter和setter 数组的默认的第几0个元素是null 创建三个对象 输 ...
- WordPress致命错误 紧急处理代码
将下面代码添加到当前主题函数模板 functions.php 中: dadd_filter( 'wp_fatal_error_handler_enabled', '__return_false' );
- Spring MVC配置文件
都说开发Spring Web程序的配置文件很繁琐,所以就写了一篇配置博客, 首先是pom.xml文件 <project xmlns="http://maven.apache.org/P ...
- python控制流-流程控制语句
一.if语句 if 语句的子句(也就是紧跟 if 语句的语句块), 将在语句的条件为 True 时执行.如果条件为 False,子句将跳过. 在英文中,if 语句念起来可能是“:如果条件为真,执行子句 ...
- raid10 五块硬盘/raid5(三块使用,两块备份)
raid 10五块硬盘 第一步:在虚拟机中在添加五块硬盘 第二步:使用mdadm命令创建RAID10,名称为“/dev/md0/” -C代表创建操作,-v显示创建过程,-a yes检查RAID名称,- ...
- windows10安装ipython
Win10中如何装IPython?(其他Windows版本,如win7.win8/8.1也通用)我的这个方法比较简单,配置好环境变量敲几行命令就行了 .安装IPython的前提是已经安装好了Pytho ...
- SpringBoot(十) -- Spring Data
一.Spring Data简介 Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问技术,包括非关系数据库.Map-Reduce 框架.云数据服务等等:另外也包含对关 ...