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 ...
随机推荐
- Idea导入项目详解
1.点击Import Project选择项目所在目录 2.Import Project选项区别: 1)如果选择Create project from existing sources选项, 则你只能导 ...
- Linux_DNS服务器
目录 目录 DNS DNS Server ServerSite Master DNS Server Forward Domain Reverse Resolution Slave DNS Server ...
- HashTable 和 HashMap 区别
hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法. hashTable同步的,而HashMap是非同步的,效率上 ...
- git_03_git可视化工具github Desktop使用教程
前言 github desktop是github的桌面客户端,支持Windows和Mac OS版本.使用简单,可以查看.切换和创建分支,以及提交.合并或部署代码. 下载 由于电脑限制,这里以mac o ...
- linux安装JSONCPP
#tar -zxf scons-2.1.0.tar.gz #cd scons-2.1.0 #python setup.py install #tar -zxf jsoncpp-src-0.5.0. ...
- REACT--》fetch---基本使用
[WangQI]---fetch---基本使用 一.fetch fetch是一种XMLHttpRequest的一种替代方案,在工作当中除了用ajax获取后台数据外我们还可以使用fetch.axio ...
- [Python3 练习] 009 利用列表隐藏并找到有用的信息
题目:利用列表隐藏并找到有用的信息 (1) 描述 1) 题源 鱼 C 论坛中"小甲鱼"老师出的题 链接地址:第020讲:函数:内嵌函数和闭包 | 课后测试题及答案 2) 修改 题中 ...
- SpringBoot(七) -- 嵌入式Servlet容器
一.嵌入式Servlet容器 在传统的开发中,我们在完成开发后需要将项目打成war包,在外部配置好TomCat容器,而这个TomCat就是Servlet容器.在使用SpringBoot开发时,我们无需 ...
- sublime text3插件安装及使用
sublime官网下载地址:http://www.sublimetext.com/ 我用的是SubLime text3,插件安装命令地址:https://packagecontrol.io/insta ...
- Eclipse解除已关联的Coding远程仓库,重新关联github上的远程仓库
1.在Eclipse中的Git Repositories中找到要解除的仓库,依次找到Remote--origin[视自己的实际情况选择], 2.选中origin,右键选择Delete Remote , ...