`
lengyingxin
  • 浏览: 57982 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java的内存映射--MappedByteBuffer

 
阅读更多
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;


public class MapFileDemo {

/**
*    对于大多数操作系统而言,与通过普通的 read 和 write 方法读取或写入数千字节的数据相比,
*    将文件映射到内存中开销更大。从性能的观点来看,通常将相对较大的文件映射到内存中才是
*    值得的,但是不是越大越好,在超过了相对了内存大小的一定比例之后会抛出异常。
     *    MappedByteBuffer直接字节缓冲区,其内容是文件的内存映射区域。映射的字节缓冲区是通过
     *     FileChannel.map 方法创建的.
*/
public static void main(String[] args) throws FileNotFoundException,IOException {
       
MappedByteBuffer mapFile = new RandomAccessFile("D://text.txt", "rw")
       .getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1000000);


Long startTime = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++ ){
mapFile.put((byte)('i'+i));
}
System.out.println("Memory reflect finish!");
for(int i = 0; i < 1000000; i++){
mapFile.get(i);
}
Long endTime = System.currentTimeMillis();
        System.out.println("the spend time is: " + (endTime-startTime));
       
使用内存映射的方式进行读写所消耗的时间是:  the spend time is: 31


// RandomAccessFile rf = new RandomAccessFile("D://text1.txt", "rw");
// Long startTime = System.currentTimeMillis();
// for(int i = 0; i < 1000000; i++ )
// rf.write('i'+i);
//
// for(int j = 0; j < 1000000; j++ ){
// rf.read();
//
// }
//
// Long endTime = System.currentTimeMillis();
// System.out.println("the spend time is: " + (endTime-startTime));
使用RandomAccessFile操作消耗的时间:the spend time is: 7956


        File file = new File("D://t1.txt");
        FileInputStream fi = new FileInputStream(file);
        FileOutputStream fo = new FileOutputStream(file);
        Long startTime = System.currentTimeMillis();
        for(int i = 0; i < 1000000; i++ ){
        fo.write((byte)('b'+i));
}
        for(int i = 0; i < 1000000; i++){
fi.read();
}
Long endTime = System.currentTimeMillis();
        System.out.println("the spend time is: " + (endTime-startTime));
使用普通的IO操作消耗的时间是:the spend time is: 8093
}

}
0
4
分享到:
评论

相关推荐

    Java NIO 应用使用内存映射文件实现进程间通信

    在Java NIO中,内存映射文件(MappedByteBuffer)是一个重要的特性,它允许将文件直接映射到内存中,以便于快速访问和修改文件内容。这一特性不仅提高了读写效率,而且还能用于进程间通信(IPC)。 内存映射文件的...

    java全栈工程师-java io

    ### Java内存映射文件 内存映射文件是一种高效的数据处理方式,它可以将文件或部分文件的内容映射到内存中,从而可以直接通过内存地址访问文件内容,提高了文件访问的速度。Java中通过`FileChannel`的`map()`方法...

    java-instantcode-developing.rar_java nio

    4. **内存映射文件(MappedByteBuffer)**:Java NIO提供了一种高效访问大文件的方式,即内存映射文件。通过映射文件到内存,可以直接通过内存操作文件,减少了磁盘I/O的开销。 5. **非阻塞模式**:与传统的阻塞IO...

    【IT十八掌徐培成】Java基础第27天-01.MappedMemoryBuffer-文件内存映射缓冲区.zip

    在标题和描述中提到的“文件内存映射缓冲区”是Java处理大文件的一种高级技术,它允许将文件直接映射到虚拟内存中,从而使得程序可以直接对文件进行读写操作,而无需通过传统的I/O流。 MappedByteBuffer的使用涉及...

    Java中用内存映射处理大文件的实现代码

    为了解决这个问题,Java提供了一种名为“内存映射文件”(Memory-Mapped File)的技术,它可以将文件直接映射到内存中,使得数据读写如同操作内存一样快速。本文将详细介绍如何在Java中使用内存映射文件,并通过示例...

    java-Operation-On-Files.rar_operation

    - **MappedByteBuffer**:Java NIO中的内存映射文件,可以直接将文件映射到内存,进行高效的大文件操作。 6. **文件操作注意事项** - 总是在使用后关闭流,以释放系统资源,避免资源泄漏。可以使用try-with-...

    java 深入理解内存映射文件原理

    在Java中,使用内存映射文件通常通过java.nio包中的MappedByteBuffer类实现。通过FileChannel的map()方法,可以将文件映射到内存,从而提高大文件处理的性能。例如,以下代码展示了如何使用内存映射文件读取10MB的...

    Java内存映射 大文件轻松处理

    Java内存映射是一种高效处理大文件的技术,它允许程序通过虚拟内存系统直接访问文件内容,而无需通过传统的I/O操作。这种方式极大地提升了处理大文件的性能,因为内存映射文件通常利用操作系统级别的缓存机制,减少...

    Java-NIO-系列教程

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

    基于Java的源码-二进制IO类与文件复制操作实例.zip

    7. **内存映射文件(Memory-Mapped File)**:对于大文件操作,Java还提供了MappedByteBuffer,它可以将文件映射到内存,使得文件操作如同访问内存一样高效。 8. **NIO(New IO)**:Java NIO提供了一种非阻塞的IO...

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

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

    java大文件读取-乔乐共享

    在Java中,处理大文件主要有两种常用的方法:内存映射文件和分块读取。 ##### 2.1 内存映射文件 内存映射文件是一种特殊的文件处理方式,它能够将文件的一部分或者全部映射到内存地址空间中,从而允许程序像访问...

    深入浅出MappedByteBuffer.pdf

    **MappedByteBuffer**是Java NIO中用于内存映射文件的工具,它允许将文件内容直接映射到Java虚拟机的内存中,从而提供高效的文件读写性能。相比于传统的IO操作,MappedByteBuffer避免了数据在用户空间和内核空间之间...

    Java中使用内存映射实现大文件上传实例

    Java中的内存映射(Memory-Mapped File)是一种高效处理大文件的技术,它允许将文件直接映射到进程的虚拟内存空间中,使得程序可以像访问内存一样直接读写文件,从而提高了大文件处理的性能。这种方法尤其适用于需要...

    IPC.rar_IPC_java i_java ipc_java共享内存_共享内存

    1. **创建内存映射文件**:使用`java.nio.channels.FileChannel`的`map()`方法,将磁盘上的文件映射到内存中。这一步实际上是在操作系统层面创建了一个共享的内存区域。 2. **获取映射缓冲区**:通过调用`...

    MemMapComm:代码存储库,用于使用Java的内存映射文件测试IPC

    在Java中,内存映射文件是通过`java.nio.MappedByteBuffer`类来实现的,它允许程序将文件的一部分或全部映射到虚拟内存空间,从而使得多个进程可以直接共享数据,而无需传统的读写文件操作。 **内存映射文件的工作...

    java-io-examples

    7. 文件通道和内存映射文件:NIO(New IO)引入了通道(Channel)和缓冲区(Buffer)的概念,使得数据可以直接在通道间传输,而内存映射文件(MappedByteBuffer)允许直接操作文件,提高大文件处理效率。 8. 打包和...

    java csv大数据量导出(千万级别,不会内存溢出)

    此外,为了避免内存中的临时数据过多,还可以考虑使用Java的内存映射文件(Memory-Mapped File)。通过MappedByteBuffer,我们可以让操作系统负责数据的缓存和页面交换,这在处理大文件时能显著降低内存使用。 在...

    JAVA IO-NIO 详解

    - **MappedByteBuffer**: 直接映射文件到内存中的Buffer,允许直接在内存中修改文件内容,无需通过Channel读取。 - **优势**: 提高文件读写的效率。 **2. 使用** - **创建MappedByteBuffer**: 通过FileChannel的...

    java读取大文件

    为了有效地读取大文件,可以使用缓冲区(Buffer)和内存映射文件(MappedByteBuffer)技术。下面将详细解释如何使用这些技术以及代码中的关键部分。 1. **缓冲区(Buffer)**: Java中的缓冲区是用于提高数据读写...

Global site tag (gtag.js) - Google Analytics