博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NIO - MappedByteBuffer
阅读量:6669 次
发布时间:2019-06-25

本文共 3742 字,大约阅读时间需要 12 分钟。

  *MappedByteBuffer的创建

  在FileChannel上调用map方法 返回一个MappedByteBuffer对象  

public MappedByteBuffer map(MapMode mode, long position, long size) 
  MapMode  映射模式(MapMode 是FileChannel中的一个内部类) 有三个可选值

   1.READ_ONLY    只读映射模式

   2.READ_WRITE  读/写映射模式

   3.PRIVATE           通过put方法对MappedByteBuffer的修改   不会修改到磁盘文件  只是虚拟内存的修改

*MappedByteBuffer在父类ByteBuffer的基础上 新增的几个方法

   1.fore缓冲区在READ_WRITE模式下,此方法对缓冲区所做的内容更改强制写入文件

   2.load:将缓冲区的内容载入物理内存,并返回该缓冲区的引用
   3.isLoaded:判断缓冲区的内容是否在物理内存,如果在则返回true,否则返回false

private final static Charset charset = Charset.forName("GBK");  		/**	 * 读文件	 * 
------------------------------
* @param path * @return * @throws IOException */ private static String read(String path) throws IOException { if (path == null || path.length() == 0) return null; FileInputStream fileInputStream = new FileInputStream(path); FileChannel fileChannel = fileInputStream.getChannel(); MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_ONLY, 0, fileChannel.size()); fileInputStream.close(); fileChannel.close(); String str = charset.decode(mappedByteBuffer).toString(); mappedByteBuffer = null; return str; } /** * 追加内容 *
------------------------------
* @param path * @param str * @return * @throws IOException */ private static MappedByteBuffer append(String path, String str) throws IOException { if (str == null || str.length() == 0) return null; RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw"); FileChannel fileChannel = randomAccessFile.getChannel(); byte[] bytes = str.getBytes(); long size = fileChannel.size() + bytes.length; MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_WRITE, 0, size); fileChannel.close(); randomAccessFile.close(); int position = mappedByteBuffer.limit() - bytes.length; mappedByteBuffer.position(position); mappedByteBuffer.put(bytes); mappedByteBuffer.force(); mappedByteBuffer.flip(); return mappedByteBuffer; } /** * 文件复制 *
------------------------------
* @param srcfilePath * @param targetPath * @throws IOException */ private static void copy(String srcfilePath, String targetPath) throws IOException { File file = new File(targetPath); if (!file.getParentFile().exists()) { file.mkdirs(); } RandomAccessFile inRandomAccessFile = new RandomAccessFile(srcfilePath, "r"); FileChannel inFileChannel = inRandomAccessFile.getChannel(); MappedByteBuffer inMappedByteBuffer = inFileChannel.map(MapMode.READ_ONLY, 0, inFileChannel.size()); inRandomAccessFile.close(); inFileChannel.close(); RandomAccessFile outRandomAccessFile = new RandomAccessFile(targetPath, "rw"); FileChannel outFileChannel = outRandomAccessFile.getChannel(); MappedByteBuffer outMappedByteBuffer = outFileChannel.map(MapMode.READ_WRITE, 0, inMappedByteBuffer.capacity()); outMappedByteBuffer.put(inMappedByteBuffer); outMappedByteBuffer.force(); outRandomAccessFile.close(); outFileChannel.close(); outMappedByteBuffer.flip(); } /** * 不会更新到文件 只会更新虚拟内存 *
------------------------------
* @param path * @param str * @return * @throws IOException */ private static MappedByteBuffer doTestPrivateMode(String path, String str) throws IOException { if (str == null || str.length() == 0) return null; RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw"); FileChannel fileChannel = randomAccessFile.getChannel(); byte[] bytes = str.getBytes(); long size = fileChannel.size() + bytes.length; MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.PRIVATE, 0, size); mappedByteBuffer.put(bytes); fileChannel.close(); randomAccessFile.close(); mappedByteBuffer.flip(); System.out.println(charset.decode(mappedByteBuffer)); return mappedByteBuffer; }

 

转载于:https://www.cnblogs.com/java-wl/archive/2012/06/03/2923152.html

你可能感兴趣的文章
机器人市场机遇和挑战并存
查看>>
来看一场 AI 重建的 3D 全息世界杯比赛!
查看>>
为什么使用TypeReference
查看>>
Promise Race, 并不公平的 Race
查看>>
动态权限<三>华为小米特殊机制
查看>>
[方法总结] 如何入门一个新领域/新技术?——「以用促学知识树学习法」
查看>>
有了这四个“最”,AI或许可以成功预测地震
查看>>
linux基本命令学习01
查看>>
Freebsd for ECS 系统盘扩容示例
查看>>
IPad分屏,当电脑第二显示屏
查看>>
kprobe原理解析
查看>>
String的线程安全
查看>>
云服务提供商告诉您云服务器对营销型网站的重要性
查看>>
前端通信:ajax设计方案(七)--- 增加请求错误监控、前端负载均衡以、请求宕机切换以及迭代问题修复...
查看>>
软硬件一体提高主链性能,「HPB芯链」想构建区块链版的云计算
查看>>
打车更难了!滴滴正式停止北京三环内非京牌车辆派单
查看>>
AWS 推出增强的 Elasticsearch 开源发行版
查看>>
法定数字货币,将如何重塑全球跨境支付体系?
查看>>
Ionic 框架宣布 2019 年将正式支持 Vue 和 React
查看>>
php 在mac上为php添加pcntl扩展
查看>>