`

NIO - MappedByteBuffer

 
阅读更多

转自:http://blog.csdn.net/java2000_wl/article/details/7625021

*MappedByteBuffer的创建

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

 

  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

 

  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.     }  

 

分享到:
评论

相关推荐

    Java-NIO-系列教程

    除了以上提到的 Buffer 类型之外,Java NIO 还提供了一个特殊的 Buffer 类型——`MappedByteBuffer`,用于表示内存映射文件。这种方式能够提高文件的读写效率,但由于其实现较为复杂,本概述中不做详细介绍。 #### ...

    java nio教程pdf

    Java NIO(New IO,也称为Non-Blocking IO)是一种基于通道(Channel)和缓冲区(Buffer)的I/O操作方法,用于替代标准Java IO API。Java NIO提供了与标准IO不同的I/O工作方式,它是面向缓冲区、基于通道的I/O操作,...

    JAVA-NIO程序设计完整实例

    - **内存映射文件**: 对于大数据处理,可以利用MappedByteBuffer将文件映射到内存,减少磁盘I/O。 - **网络通信优化**: 在网络编程中,通过NIO的非阻塞模式,可以更有效地处理网络数据的读写。 ### 5. 示例代码...

    java nio 包读取超大数据文件

    - `MappedByteBuffer inputBuffer = channel.map(FileChannel.MapMode.READ_ONLY, f.length()*begin_fz/begin_fm, f.length()*end_fz/end_fm);`将文件的一部分映射到内存中。 3. **数据读取** - 创建一个固定大小...

    commons-mmf.rar_java nio_java共享内存_共享内存

    在Java中,可以通过`java.nio.MappedByteBuffer`类来实现共享内存功能,这被称为内存映射文件(Memory-Mapped File,MMF)。 `MappedByteBuffer`是NIO中的一种特殊缓冲区,它将文件的一部分映射到内存中,使得文件...

    java NIO.zip

    通过MappedByteBuffer类,可以直接在内存中对文件进行操作,提高大文件处理的性能。 7. **管道(Pipes)**: 管道用于在两个线程间创建单向数据通道,它们并不直接与任何外部资源关联,而是线程间的通信工具。 总...

    JAVA IO-NIO 详解

    ### JAVA IO-NIO 详解 #### 一、IO与NIO概述 在Java开发中,输入/输出(IO)操作是程序与外部环境交互的重要环节。通过IO操作,程序可以读取外部数据或向外部环境输出数据。Java的IO体系自Java 1.0以来就一直存在...

    NIO trick and trap NIO网络

    - 减少数据复制:利用DirectByteBuffer或MappedByteBuffer减少不必要的数据复制。 - 降低上下文切换:合理利用线程池减少上下文切换。 - 优化内存管理:合理使用缓存和对象池减少垃圾回收压力。 - 利用高级IO...

    深入浅出MappedByteBuffer.pdf

    《深入浅出MappedByteBuffer》这篇文章主要探讨了Java NIO中MappedByteBuffer这一高效处理大文件的机制,以及与其相关的计算机内存管理概念。首先,我们来详细理解一下这些知识点。 内存管理是计算机系统的重要组成...

    NIO按行读取数据

    总的来说,上述代码提供了一个自定义的NIO解决方案来按行读取文件,尽管Java NIO本身并不直接支持这个功能。这种实现方式充分利用了NIO的内存映射特性,提高了读取效率,但同时也需要开发者关注潜在的兼容性和资源...

    NIO 入门.chm,NIO 入门.chm

    通过MappedByteBuffer,可以直接将文件映射到内存,提高文件读写的效率。 6. **网络I/O**:NIO为TCP和UDP提供了SocketChannel和DatagramChannel,用于处理网络连接。SocketChannel用于TCP连接,而DatagramChannel则...

    Java NIO系列教程

    - **Memory-Mapped Files**:使用 `MappedByteBuffer` 对象来实现对内存映射文件的访问。 - **Scatter/Gather**:允许数据从多个缓冲区写入通道,或从通道读取数据到多个缓冲区中。 - **FileLocks**:用于文件锁定的...

    《NIO与Socket编程技术指南》_高洪岩

    2. 文件操作:讲解如何使用NIO进行文件的读写操作,包括文件通道和MappedByteBuffer的使用。 3. 非阻塞I/O:对比NIO和BIO,解释非阻塞I/O的优势,并展示如何在实际项目中应用。 4. 多路复用:详述选择器的工作原理,...

    nio.rar_Different_NIO_java nio package

    5. **内存映射文件(MappedByteBuffer)**:这是NIO的一个高级特性,允许将文件直接映射到内存,使得文件操作更高效。通过FileChannel的map方法,我们可以创建MappedByteBuffer对象,然后直接对它进行读写操作。 6....

    Java NIO 中英文版

    - Java NIO提供了一组文件系统操作API,例如FileChannel用于读写文件,MappedByteBuffer实现了内存映射文件,可以直接通过内存访问文件内容,提高了读写速度。 4. **缓冲区的分类** - **ByteBuffer**:用于处理...

    Java NIO测试示例

    使用MappedByteBuffer,NIO可以将文件映射到内存,使得文件操作如同操作内存一样快速,特别适合大数据处理。 在实际应用中,Java NIO通常用于高性能的服务器编程,例如在开发聊天服务器、Web服务器或游戏服务器时...

    Java NIO 国外 PPT 课件(精华)

    最后,`Java_NIO.ppt`很可能是整个NIO主题的综合教程,覆盖了从基础到进阶的所有内容,包括基本的读写操作、多路复用、内存映射文件(MappedByteBuffer)以及NIO在Socket通信中的应用等。 总的来说,这些PPT课件构成...

    NIO入门pdf分享

    5. **文件系统操作**:NIO提供了FileChannel,支持文件的高效读写,如映射内存到文件(MappedByteBuffer),以及文件的随机访问。 6. **网络通信**:NIO为网络通信提供了SocketChannel和ServerSocketChannel,它们...

    apache nio 很好的学习资料

    5. **文件系统接口**:Java NIO提供了更强大的文件系统访问功能,例如文件通道(FileChannel)、映射文件(MappedByteBuffer)等,可以直接映射文件到内存,提高文件操作速度。 在实际开发中,Apache NIO常用于...

    Java NIO 中英文版 + Pro Java 7 NIO.2

    5. **文件系统操作**:NIO提供FileChannel,可以高效地进行文件读写操作,包括映射文件到内存(MappedByteBuffer)。 6. **管道(Pipes)**:管道是两个线程之间进行单向数据传输的通道,用于线程间通信。 7. **...

Global site tag (gtag.js) - Google Analytics