DirectByteBuffer直接内存的使用场景和作用

生命周期长的大对象,

减少java堆GC, 减少内存copy

http://www.importnew.com/26334.html


 public class DirectByteBufferTest {

     @Test
public void test_copyFile() throws IOException {
ByteBuffer byteBuffer = ByteBuffer.allocateDirect();//100kbytes
FileChannel readChannel = FileChannel.open(new File("D:/in.txt").toPath());
//out.txt必须已经存在, writeChannel必须以WRITE方式打开
FileChannel writeChannel = FileChannel.open(new File("D:/out.txt").toPath(), StandardOpenOption.WRITE);
int read;
while ((read = readChannel.read(byteBuffer)) != -) {
//buffer从读切换到写
byteBuffer.flip();
// 打印信息必须放在flip后面, 否则decode出来的是上次read的结果.根据in.txt的字符编码修改下面的ISO_8859_1
//System.out.println(read + "--" + StandardCharsets.ISO_8859_1.decode(byteBuffer));
writeChannel.write(byteBuffer);
// 写完之后清空缓冲区,否则read=0一直死循环
byteBuffer.clear();
}
writeChannel.close();
readChannel.close();
}
}

测试其他总结:

ByteBuffer.allocateDirect缓冲区大小根据输入文件的大小调整,但是太大时输出性能也提高不了多少, 对于大文件,1M的缓存区应该差不多了。对于超大文件, 应该换成其他读取方式

FileChannel与ByteBuffer的使用示例的更多相关文章

  1. NIO之FileChannel操作示例

    1. 写文件操作 /** * 写文件 */ public class FileChannelTest { public static void main(String[] args) throws I ...

  2. FileChannel指南

    推荐关注公众号:锅外的大佬 每日推送国外技术好文,帮助每位开发者更优秀地成长 原文链接:https://www.baeldung.com/java-filechannel 作者:baeldung 译者 ...

  3. Java NIO 文件通道 FileChannel 用法

    FileChannel 提供了一种通过通道来访问文件的方式,它可以通过带参数 position(int) 方法定位到文件的任意位置开始进行操作,还能够将文件映射到直接内存,提高大文件的访问效率.本文将 ...

  4. ByteBuffer用法小结

    在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区.缓冲区是定长的,基本上它只是一个列表,它的所有元素 ...

  5. ByteBuffer用法总结

    转自:http://blog.csdn.net/mars5337/article/details/6576417 在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChanne ...

  6. ByteBuffer详解

    注意:一定要了解这个缓冲类的几个方法和那几个字段.不然你不会明白的. 字段: position ,limit ,mark 方法:clear(), hasRemaining(),flip() 推荐博客: ...

  7. 【Java学习】调用ByteBuffer.getInt()方法得到808464432

    调用ByteBuffer.getInt()方法遇到的奇怪错误 最近在参加阿里的中间件比赛,中间用到了RocketMQ的思想,并且主要集中在使用NIO来读写文件.其中遇到了一个很蛋疼的问题,想了半天想不 ...

  8. Java NIO中的读和写

    一.概述 读和写是I/O的基本过程.从一个通道中读取只需创建一个缓冲区,然后让通道将数据读到这个缓冲区.写入的过程是创建一个缓冲区,用数据填充它,然后让通道用这些数据来执行写入操作. 二.从文件中读取 ...

  9. Java编程思想学习笔记_5(IO流)

    一.用DataInputStream读取字符 可以使用available方法查看还有多少可供存取的字符.示例如下: public class Test1 { public static void ma ...

随机推荐

  1. S3C2410中文芯片手册-11.串口

    目录 11 UART Overview Featrues UART Operation Data Transmission Data Reception Auto Flow Control(AFC) ...

  2. jcrop的bug

    1 360(7.1.1.620,内核:31.0.1650.63)的极速模式下,出现裁剪框后,鼠标点击,页面就会滑动到底部. 查看了下源码,发现是下面的代码: function watchKeys() ...

  3. 不同类型input尺寸设置区别

    最近发现为不用类型的input设置相同的尺寸,却得到了不一样的尺寸结果.发现不同类型的input的height和width竟然含义不同.在此小整理一下. (1)button类型 规律 button类型 ...

  4. Python 中list, dictionary 与 file相互操作

    Python的list,dictionary可以写入file, 也可以从file中读取. 关于list: 1)写入文件         self.existedBlog.write("you ...

  5. ZOJ1610(经典线段树涂色问题)

    Description Painting some colored segments on a line, some previously painted segments may be covere ...

  6. netty中的EventLoop和EventLoopGroup

    Netty框架的主要线程就是I/O线程,线程模型设计的好坏,决定了系统的吞吐量.并发性和安全性等架构质量属性. 一.Netty的线程模型 在讨论Netty线程模型时候,一般首先会想到的是经典的Reac ...

  7. java基础知识(3)----面向对象

    三:面向对象:特点: 1:将复杂的事情简单化.2:面向对象将以前的过程中的执行者,变成了指挥者.3:面向对象这种思想是符合现在人们思考习惯的一种思想. 过程和对象在我们的程序中是如何体现的呢?过程其实 ...

  8. zookeeper.out: Permission denied错误解决方法

    [hadoop@node1 root]$ zkServer.sh start JMX enabled by default Using config: /opt/software/zookeeper- ...

  9. 韩顺平循序渐进学JAVA从入门到精通 视频全套,需要的联系我

    0讲-开山篇.avi 10讲-访问修饰符.重载.覆盖.avi 11讲-约瑟夫问题.avi 12讲-多态.avi 13讲-抽象类.接口.avi 14讲-final.作业评讲.avi 15讲-作业.测试题 ...

  10. IPC编程之消息队列

    本地的进程间通信(IPC)有很多种方式,但可以总结为下面3类: 1.消息传递(管道.FIFO.消息队列) 2.同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 3.共享内存(匿名的和具名的) ...