`
AliceHR520
  • 浏览: 4775 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类

MappedByteBuffer的使用(转)

 
阅读更多

其实掌握MappedByteBuffer并不难,只要记住“三方三法三特性”(我自己总结的,呵呵~~不要扔鸡蛋哦。。。)这句话就可以轻松搞定!MappedByteBuffer 只是一种特殊的 ByteBuffer ,即是ByteBuffer的子类。 MappedByteBuffer 将文件直接映射到内存(这里的内存指的是虚拟内存,并不是物理内存,后面说证明这一点)。通常,可以映射整个文件,如果文件比较大的话可以分段进行映射,只要指定文件的那个部分就可以。而且,与ByteBuffer十分类似,没有构造函数(你不可new MappedByteBuffer()来构造一个MappedByteBuffer),我们可以通过 java.nio.channels.FileChannel 的 map() 方法来获取 MappedByteBuffer 。其实说的通俗一点就是Map把文件的内容被映像到计算机虚拟内存的一块区域,这样就可以直接操作内存当中的数据而无需操作的时候每次都通过I/O去物理硬盘读取文件,所以效率上有很大的提升!

三种方式:

              FileChannel提供了map方法来把文件影射为内存映像文件: MappedByteBuffer map(int mode,long position,long size); 可以把文件的从position开始的size大小的区域映射为内存映像文件,mode指出了 可访问该内存映像文件的方式:READ_ONLY,READ_WRITE,PRIVATE.                     

a. READ_ONLY,(只读): 试图修改得到的缓冲区将导致抛出 ReadOnlyBufferException.(MapMode.READ_ONLY)

       b. READ_WRITE(读/写): 对得到的缓冲区的更改最终将传播到文件;该更改对映射到同一文件的其他程序不一定是可见的。 (MapMode.READ_WRITE)

        c. PRIVATE(专用): 对得到的缓冲区的更改不会传播到文件,并且该更改对映射到同一文件的其他程序也不是可见的;相反,会创建缓冲区已修改部分的专用副本。 (MapMode.PRIVATE)

 

三个方法:

a. fore();缓冲区是READ_WRITE模式下,此方法对缓冲区内容的修改强行写入文件

b. load()将缓冲区的内容载入内存,并返回该缓冲区的引用

c. isLoaded()如果缓冲区的内容在物理内存中,则返回真,否则返回假

三个特性:

调用信道的map()方法后,即可将文件的某一部分或全部映射到内存中,映射内存缓冲区是个直接缓冲区,继承自ByteBuffer,但相对于ByteBuffer,它有更多的优点:

a. 读取快

b. 写入快

c. 随时随地写入

       口说无凭,俗话说的好,是金子是银子拿来炼一炼就知道(也不知道有没有这么一句俗话,反正用到这还合适,就这么凑合吧,大家扔鸡蛋~~~)!

1 MappedByteBuffer的读取/写入文件和普通I/O流的对比

 

public class MapMemeryBuffer {

       public static void main(String[] args) throws Exception {

              ByteBuffer byteBuf = ByteBuffer.allocate(1024 * 14 * 1024);
              byte[] bbb = new byte[14 * 1024 * 1024];
              FileInputStream fis = new FileInputStream("d:\\test");
              FileOutputStream fos = new FileOutputStream("d:\\outFile.txt");

              FileChannel fc = fis.getChannel();
              long timeStar = System.currentTimeMillis();//得到当前的时间
              fc.read(byteBuf);//1 读取
              long timeEnd = System.currentTimeMillis();//得到当前的时间
              System.out.println("Read time :" + (timeEnd - timeStar) + "ms");
              timeStar = System.currentTimeMillis();
              fos.write(bbb);// 写入
         timeEnd = System.currentTimeMillis();
              System.out.println("Write time :" + (timeEnd - timeStar) + "ms");

              fos.flush();

              fc.close();

              fis.close();

       }

}

 

输出结果:

Read time :1874ms

Write time :360ms

把上面的程序的1换成MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fileLength);

2换成mbb.flip();

输出结果:

Read ByteBuf take time :16ms

Write ByteBuf take time :0ms

可见普通I/O和MappedByteBuffer是没法比的。另外在写入的时候花了0ms说明Map写入机制是根据你的更改量来决定,就是只保存修改部分的!

 

分享到:
评论

相关推荐

    深入浅出MappedByteBuffer.pdf

    《深入浅出MappedByteBuffer》这篇文章主要探讨了Java NIO中MappedByteBuffer这一高效处理大文件的机制,以及与其相关的...对于处理大量数据或大文件的Java应用,使用MappedByteBuffer是优化IO操作的一个有效手段。

    读取文件数据并解析成bean实体类

    6. **任意文件转任意实体**:实现这一功能可能需要一种灵活的策略,如使用反射机制动态地获取Bean的类信息,并结合文件解析器来填充Bean的属性。同时,需要考虑文件编码、数据格式识别等问题。 7. **配置Class类**...

    Java图片加水印,支持旋转和透明度设置.7z

    例如,可以使用内存映射文件(MappedByteBuffer)来提高读写速度,或者利用多线程并行处理。 总之,这个压缩包提供的Java代码示例旨在演示如何在图片上添加具有旋转和透明度设置的水印,这是图像处理领域的一个实用...

    Java图片加水印,支持旋转和透明度设置

    可以使用内存映射文件(MappedByteBuffer)或Java 2D的双缓冲技术来提高效率。 总之,Java图片加水印并支持旋转和透明度设置是一个综合性的图像处理任务,涉及到Java的图形API,包括图像加载、绘制、旋转和透明度...

    java使用renderer将pdf按页转换为图片

    - 将FileChannel映射到内存中,使用MappedByteBuffer进行读取。 - 创建PDFFile对象,并通过该对象访问PDF文件的页。 - 为每一页创建一个BufferedImage对象,并设置合适的缩放比例以控制图片清晰度。 - 使用JPEGCodec...

    java实现pdf按页转换为图片

    * java.nio.MappedByteBuffer:用于映射文件到内存 * com.sun.image.codec.jpeg.JPEGCodec:用于jpeg编码 * com.sun.image.codec.jpeg.JPEGEncodeParam:用于jpeg编码参数 * ...

    java大字段转换

    - 使用`java.nio.MappedByteBuffer`将文件映射到内存中,允许直接操作文件而无需全部加载到内存。 6. **Off-Heap存储**: - 使用Off-Heap内存,如Apache JBoss的`Chronicle Queue`或Oracle的Java堆外内存分配,...

    java如何将pdf转换成image

    在本文中,我们将详细介绍如何使用java将pdf转换成image。这种技术在实际应用中非常有价值,例如在文档管理系统、图像处理系统等领域都有广泛的应用。 首先,我们需要使用apache的PDFBox组件来实现pdf到image的转换...

    FileObjectConvert

    - 使用内存映射文件 (MappedByteBuffer):对于大文件,内存映射文件可以提高性能,因为它将文件直接映射到内存中,使得读写如同操作内存一样快速。 总的来说,"FileObjectConvert"这个类可能是实现文件对象转换的...

    打开二进制的软件 java

    4. **使用FileChannel和MappedByteBuffer**:通过`java.nio`包中的类,可以进行更高效的数据传输。`FileChannel`允许直接从文件通道读写数据,而`MappedByteBuffer`则可以将文件映射到内存,提供随机访问和高性能的...

    java NIO原理和使用

    MappedByteBuffer mappedBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, fileChannel.size()); ``` 在这个例子中,我们将整个文件映射到了内存中,并设置了读写权限。 #### 三、Java NIO 使用实例 ...

    NIO按行读取数据

    这里使用了`MappedByteBuffer`的`map()`方法来映射文件的部分区域到内存。 - `getNextLine()`方法是核心的读取方法,根据当前块和行的计数器返回下一行。如果当前块的行已读完,会切换到下一个块并继续读取。 3. *...

    IO详解宝典

    高级特性可能包括使用FileChannel进行大文件传输,以及使用MappedByteBuffer实现内存映射文件,提高读写速度。另外,还有转换流(OutputStreamWriter和InputStreamReader)用于在字节流和字符流之间转换,字符编码如...

    java io 系列操作代码练习 Java学习资料

    3. 使用FileChannel进行大文件的高效传输,如内存映射文件(MappedByteBuffer)。 六、网络IO Java IO也支持网络通信,如Socket和ServerSocket类,可用于建立客户端和服务器之间的连接,进行数据交换。 七、课程...

    java 细节代码收集 供自己查看

    如果文件较大,可能需要使用`FileChannel`和内存映射文件(MappedByteBuffer)来提高性能。 对于源码分析,Java的反射API允许在运行时检查类、接口、字段和方法的信息,甚至动态调用方法。这对于工具开发、插件系统...

    java利用替换Excel2007中sheet方式导出excel,支持大数据量

    4. 利用内存映射文件(MappedByteBuffer):对于极大数据,可以使用内存映射文件直接将数据写入硬盘,减少内存拷贝。 总之,通过合理的设计和使用如Apache POI这样的库,Java开发者可以在不牺牲性能的前提下,有效...

    webservice demo2

    在Java中,可以使用java.nio.MappedByteBuffer类来创建内存映射文件,提高读写效率。 2. "07_soa.rar" - 这个文件的扩展名是RAR,通常用于压缩和归档文件。"07_soa"可能代表第7部分的面向服务架构(SOA)相关材料,SOA...

    bank银行转账存钱+txt

    - **内存映射文件**:使用`java.nio`包的`MappedByteBuffer`,可以将文件内容映射到内存,提高读写效率。 - **数据库替代**:在实际应用中,为了数据安全和性能,通常会使用关系型数据库(如MySQL)或NoSQL数据库...

    Java的io的应用

    FileChannel允许直接映射文件到内存,使用MappedByteBuffer可以高效地处理大文件。 14. **FilterStream**: FilterInputStream和FilterOutputStream是过滤流,可以作为装饰者模式的实例,用于在原有流的基础上...

    javaweb 读取 classes 下的文件

    // 然后使用java.nio的FileChannel、MappedByteBuffer等进行操作 ``` 无论哪种方式,都要确保文件路径的正确性,并且考虑到部署环境的影响,因为开发环境和生产环境的类路径可能会有所不同。在处理完文件后,别忘...

Global site tag (gtag.js) - Google Analytics