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 ...
随机推荐
- Rhybox播放mp3, smplayer如何播放flv等等
[[ 支持mp3,在终端: sudo apt-get install gstreamer0.10-*plugins-ugly 支持wma,在终端: sudo apt-get install gstre ...
- 《图解 CSS3 核心技术与案例实战》
第一章 解开 CSS3 的面纱 使用 CSS3 的好处 减少开发和维护成本:如传统实现圆角边框需要绘图.切图才能完成,而使用 css 可以直接完成 提高页面性能 渐进增强(Progressive En ...
- python实现格式化输出9*9乘法表
# python 9*9 乘法表 for i in range(1,10): for j in range(1,i+1): print("%s*%s=%s"%(i,j,i*j),e ...
- DRF中的视图集的使用
1.说明:DRF框架中的视图集: 在drf开发接口中,使用GenericAPIView和视图扩展类结合起来完成接口功能是一件很常见的事情,所以,drf的作者帮我们提前把 GenericAPIView ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_10 打印流_1_打印流_概述和使用
system.out就是打印流 System的源码里面out参数就是一个PrintStream类型的 例如路径写的是E盘,.没有e盘这个路径就会抛出异常 用println直接写入的就是97 这个 ...
- vue猜数字游戏
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- linux下安装php扩展的redis
bu要在网上顺便找个redis扩展,一是不安全,而是,别人的redis可能只能new,能连接,但是不保证是否能进行其他操作, 1.百度一下php redis扩展. 搜索到这个网址:http://pec ...
- 20190909 SpringBoot集成Swagger
SpringBoot集成Swagger 1. 引入依赖 // SpringBoot compile('org.springframework.boot:spring-boot-starter-web' ...
- 396. Coins in a Line III
刷 July-31-2019 换成只能从左边或者右边拿.这个确实和Coins in a Line II有关系. 和上面思路一致,也是MinMax思路,只不过是从左边和右边选,相应对方也是这样. pub ...
- python字典使用总结
作者:python技术人 博客:https://www.cnblogs.com/lpdeboke 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 ...