标签:Java NIO int FileChannel inChannel 内存 缓冲区 直接
在Java NIO中,ByteBuffer是一个”特殊“存在,因为相较其他buffer,除了通用的获取buffer的方法 allocate(int capacity) 外,它还提供了一个public static ByteBuffer allocateDirect(int capacity) 的方法来获取ByteBuffer对象。而通过这个方法获取到的ByteBuffer对象,可以“直接”操作本地内存进行读写,这即是直接缓冲区。
直接缓冲区与非直接缓冲区区别
非直接缓冲区通过allocate(int capacity)方法获取,缓冲区建立在JVM的内存中;
直接缓冲区通过allocateDirect(int capacity)或者FileChannel的map(MapMode mode, long position, long size)方法获取,缓冲区建立在物理内存中。读写速度更快。
非直接缓冲区数据传输
需要JVM内存和本地内存之间进行复制。
直接缓冲区数据传输
通过内存映射文件直接在物理内存读写。
Java直接缓冲区UML图
使用示例
try {
FileChannel inChannel = FileChannel.open(Paths.get("demo1.jpg"), StandardOpenOption.READ);
FileChannel outChannel = FileChannel.open(Paths.get("demo2.jpg"), StandardOpenOption.WRITE,StandardOpenOption.READ,StandardOpenOption.CREATE);
MappedByteBuffer inBuffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
MappedByteBuffer outBuffer = outChannel.map(FileChannel.MapMode.READ_WRITE, 0, inChannel.size());
byte[] dst = new byte[inBuffer.limit()];
inBuffer.get(dst);
outBuffer.put(dst);
inChannel.close();
outChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
标签:Java,NIO,int,FileChannel,inChannel,内存,缓冲区,直接 来源: https://www.cnblogs.com/wind-ranger/p/14282511.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。