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 ...
随机推荐
- 004-spring-data-elasticsearch 3.0.0.0使用【二】-spring-data之定义方法、创建repository实例、从聚合根发布事件
续上文 1.4.定义方法 存储库代理有两种方法可以从方法名称派生特定于存储的查询.它可以直接从方法名称派生查询,或者使用手动定义的查询.可用选项取决于实际store.但是,必须有一个策略来决定创建什么 ...
- php-fpm启动不起来,php-fpm无法启动的一种情况
今天碰了一个很奇怪的问题,平时好好的php-fpm修改了一个参数后,突然启动不起来了,试着把参数还原.甚至用备份的配置文件还原都没办法启动php,而且不给任务启动错误的提示,纳闷!!!后来上网找了个资 ...
- Learn Python the hard way, ex45 对象、类、以及从属关系
#!/usr/bin/python #coding:utf-8 # animal is-a object(yes,sort of sonfusing)look at the extra credit ...
- C++笔记(4)——引用及结构体
引用 C++中有一个很方便的语法叫做引用,作用就是使得函数能够对传入的参数作出全局有效的改动.用法很简单,就是在传入参数的类型后面加上&就可以指明传入的参数是引用. 例子: #include ...
- 20191105 《Spring5高级编程》笔记-第6章
第6章 Spring JDBC支持 Spring官方: 位于Spring Framework Project下. 文档: https://docs.spring.io/spring-framework ...
- [Vim 填坑] 01 Vim 中替换与注释的补充
目录 1. print( 坑的信息 ) 2. 开始填坑 (1) :n1,n2s/old/new/gc 的后续命令 ^E ^Y (2) 利用"V-可视"模式进行多行注释 1. pri ...
- mysql数据库监控工具-MONyog的配置和基本使用项
测试数据传输前,研发要求需要监控10万,50万,100万数量级的数据在传输过程数据库服务器的资源消耗情况,因为数据传输服务是定时任务执行,配置10秒中一次,一次处理500条,处理完10万数据可能要半个 ...
- SpringMvc参数绑定出现乱码解决方法
在SpringMvc参数绑定过程中出现乱码的解决方法 1.post参数乱码的解决方法 在web.xml中添加过滤器 <!-- 过滤器 处理post乱码 --> <filter> ...
- Mybatis-第N篇配置log4j1、log4j2打印执行的sql语句
1.log4j1配置 目录结构: conf.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...
- 分支结构 :if - else
分支结构 :if - else 格式一: if(条件表达式){ 执行语句; } 格式二:二选一 if(条件表达式){ 执行语句1; }else{ 执行语句2; } 格式三: 多选一 if(条件表达式1 ...