NIO - MappedByteBuffer

2024-05-01 17:38
文章标签 nio mappedbytebuffer

本文主要是介绍NIO - MappedByteBuffer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

*MappedByteBuffer的创建

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

[java]  view plain copy print ?
  1. public MappedByteBuffer map(MapMode mode, long position, long size)  
  2.    
  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

[java]  view plain copy print ?
  1. private final static Charset charset = Charset.forName("GBK");    
  2.       
  3.     /** 
  4.      * 读文件 
  5.      * <br>------------------------------<br> 
  6.      * @param path 
  7.      * @return 
  8.      * @throws IOException 
  9.      */  
  10.     private static String read(String path) throws IOException {  
  11.         if (path == null || path.length() == 0return null;  
  12.         FileInputStream fileInputStream =  new FileInputStream(path);  
  13.         FileChannel fileChannel =  fileInputStream.getChannel();  
  14.         MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_ONLY, 0, fileChannel.size());  
  15.         fileInputStream.close();  
  16.         fileChannel.close();  
  17.         String str = charset.decode(mappedByteBuffer).toString();  
  18.         mappedByteBuffer = null;  
  19.         return str;  
  20.     }  
  21.       
  22.     /** 
  23.      * 追加内容 
  24.      * <br>------------------------------<br> 
  25.      * @param path 
  26.      * @param str 
  27.      * @return 
  28.      * @throws IOException 
  29.      */  
  30.     private static MappedByteBuffer append(String path, String str) throws IOException {  
  31.         if (str == null || str.length() == 0return null;  
  32.         RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw");  
  33.         FileChannel fileChannel = randomAccessFile.getChannel();  
  34.         byte[] bytes = str.getBytes();  
  35.         long size = fileChannel.size() + bytes.length;  
  36.         MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_WRITE, 0, size);  
  37.         fileChannel.close();  
  38.         randomAccessFile.close();  
  39.           
  40.         int position = mappedByteBuffer.limit() - bytes.length;  
  41.         mappedByteBuffer.position(position);  
  42.         mappedByteBuffer.put(bytes);  
  43.         mappedByteBuffer.force();  
  44.         mappedByteBuffer.flip();  
  45.         return mappedByteBuffer;  
  46.     }  
  47.       
  48.     /** 
  49.      * 文件复制 
  50.      * <br>------------------------------<br> 
  51.      * @param srcfilePath 
  52.      * @param targetPath 
  53.      * @throws IOException  
  54.      */  
  55.     private static void copy(String srcfilePath, String targetPath) throws IOException {   
  56.         File file = new File(targetPath);    
  57.         if (!file.getParentFile().exists()) {    
  58.             file.mkdirs();    
  59.         }    
  60.         RandomAccessFile inRandomAccessFile = new RandomAccessFile(srcfilePath, "r");  
  61.         FileChannel inFileChannel = inRandomAccessFile.getChannel();  
  62.         MappedByteBuffer inMappedByteBuffer = inFileChannel.map(MapMode.READ_ONLY, 0, inFileChannel.size());  
  63.         inRandomAccessFile.close();  
  64.         inFileChannel.close();  
  65.           
  66.         RandomAccessFile outRandomAccessFile = new RandomAccessFile(targetPath, "rw");  
  67.         FileChannel outFileChannel = outRandomAccessFile.getChannel();  
  68.         MappedByteBuffer outMappedByteBuffer = outFileChannel.map(MapMode.READ_WRITE, 0, inMappedByteBuffer.capacity());  
  69.         outMappedByteBuffer.put(inMappedByteBuffer);  
  70.         outMappedByteBuffer.force();  
  71.         outRandomAccessFile.close();  
  72.         outFileChannel.close();  
  73.         outMappedByteBuffer.flip();  
  74.     }  
  75.       
  76.     /** 
  77.      * 不会更新到文件 只会更新虚拟内存  
  78.      * <br>------------------------------<br> 
  79.      * @param path 
  80.      * @param str 
  81.      * @return 
  82.      * @throws IOException 
  83.      */  
  84.     private static MappedByteBuffer doTestPrivateMode(String path, String str) throws IOException {  
  85.         if (str == null || str.length() == 0return null;  
  86.         RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw");  
  87.         FileChannel fileChannel = randomAccessFile.getChannel();  
  88.         byte[] bytes = str.getBytes();  
  89.         long size = fileChannel.size() + bytes.length;  
  90.         MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.PRIVATE, 0, size);  
  91.         mappedByteBuffer.put(bytes);  
  92.         fileChannel.close();  
  93.         randomAccessFile.close();  
  94.           
  95.         mappedByteBuffer.flip();  
  96.         System.out.println(charset.decode(mappedByteBuffer));  
  97.         return mappedByteBuffer;  
  98.     }  

这篇关于NIO - MappedByteBuffer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/952284

相关文章

还不懂BIO,NIO,AIO吗

BIO(Blocking I/O)、NIO(Non-blocking I/O)和 AIO(Asynchronous I/O)是 Java 中三种不同的 I/O 模型,主要用于处理输入 / 输出操作。 一、BIO(Blocking I/O) 定义与工作原理: BIO 即阻塞式 I/O(同步阻塞,传统IO)。在这种模型下,当一个线程发起一个 I/O 操作(如读取文件或网络数据)时,此线

JAVA NIO的笔记

Java中的NIO IO-文件的读写 NIO是Java4开始提供的用来解决IO问题的API。 Channel(通道)  Buffer(缓存区)  Selector(选择器) inputStream outPutStream 都是以Stream为观点看的 所以input为读 output为写 两个对象文件盒stream Channel读写操作都能做 Channel是执行读写操作这个工作的东西 而读写

Java高级特性增强-NIO

GitHub:https://github.com/wangzhiwubigdata/God-Of-BigData 关注公众号,内推,面试,资源下载,关注更多大数据技术~大数据成神之路~预计更新500+篇文章,已经更新50+篇~ **Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每

Java - NIO之Channel(FileChannel)

一、关于Channel     Java NIO的通道(Channel)类似流,但又有些不同:         既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。         通道可以异步地读写。         通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。       Java NIO中最重要的通道的实现:

Error:Artifact com.*******:war exploded: java.nio.file.InvalidPathException: Illeg

由于一次电脑蓝屏,Idea启动tomcat报错: Error:Artifact ':war exploded’: java.nio.file.InvalidPathException: Illegal char < > at index 71: K:\COMPANY_CODE_IDEA\FLOW_CODE*\target\activ : Illegal char < > at index 71:

Java NIO 核心知识总结

Java NIO 核心知识总结 NIO简介 在传统的I/O模型中,是以阻塞的方式进行的也就是当一个线程执行的时候线程会一直阻塞到完成工作为止。这种模型的缺点就是在并发比较大的时候性能就会比较低,并且在每次都要给一个新的任务(连接)创建一个新的线程,这个新的线程的创建和从上一个切换到这一个线程都会都性能有影响。 为了优化这个传统的io模型,在jdk1.4新引入了一个全新的new io包,在原有

Java程序员从笨鸟到菜鸟(四十三)NIO 非阻塞实现高并发

一、阻塞和非阻塞 阻塞:应用程序在获取网络数据的时候,如果网络传输很慢,就会一直等待直到传输完毕为止 非阻塞:应用程序可以直接获取已经准备就序好的数据,无需等待 二、BIO、NIO、AIO BIO(同步阻塞式 IO):服务器实现模式为一个请求一个线程,客户端有连接请求是服务器就需要启动一个线程进行处理,如果这个连接不做任何事情就造成不必要的开销 NIO(同步非阻塞式IO):服务器实现模式

第一个NIO开发演示

文章目录 Channel简介Buffer简介第一个NIO程序分析 上一篇文章 介绍了传统网络编程在处理高并发和大规模应用时通常面临性能瓶颈和资源管理问题,而 NIO 通过非阻塞 I/O 和选择器机制提供了更高效的解决方案。虽然 NIO 的 API 更复杂,但在高负载和高性能需求的场景下,它能够显著改善传统阻塞 I/O 的不足。 这篇文章, 了解下NIO的基本开发:

java BIO NIO AIO

结合JavaGuideIO部分内容食用更佳 在Java中,I/O(输入/输出)操作主要有三种模型:BIO(Blocking I/O,阻塞I/O)、NIO(Non-blocking I/O,非阻塞I/O)和AIO(Asynchronous I/O,异步I/O)。这三种模型在处理I/O操作时的工作方式和适用场景各不相同。下面对它们进行详细介绍: // 服务器端ServerSocket ser

java nio AsynchronousChannel

Java NIO 提供了 AsynchronousChannel 接口,用于支持异步 I/O 操作。与传统的阻塞和非阻塞 I/O 模型不同,AsynchronousChannel 实现了异步非阻塞的 I/O 模型,这意味着 I/O 操作可以在后台进行,当操作完成后,系统会通知应用程序或执行回调。 主要的 AsynchronousChannel 实现 AsynchronousSocketChan