Java编程思想:内存映射文件
import java.io.*;
import java.nio.IntBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.*;
public class Test {
    public static void main(String[] args){
        //LargeMappedFiles.test();
        MappedIO.test();
    }
}
class LargeMappedFiles {
    private static final int length = 0x8000000; //128M
    public static void test() {
        try{
            MappedByteBuffer out = new RandomAccessFile("./src/data.out","rw")
                    .getChannel()
                    .map(FileChannel.MapMode.READ_WRITE,0,length);
            for (int i = 0; i < length; i++) {
                out.put((byte)'c');
            }
            System.out.println("Finished Writting...");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
abstract class Tester {
    private String name;
    public Tester(String name) {
        this.name=name;
    }
    public void runTest(){
        System.out.print(name+":");
        try{
            long start = System.nanoTime();
            test();
            double duration = System.nanoTime()-start;
            System.out.format("%.2f\n",duration/1.0e9);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public abstract void test() throws IOException;
}
class MappedIO {
    private static int numOfInts = 4000000;
    private static int numOfBuffInts = 200000;
    private static Tester[] tests = {
            new Tester("Stream Write"){
                @Override
                public void test() throws IOException {
                    DataOutputStream out = new DataOutputStream(
                            new BufferedOutputStream(
                                    new FileOutputStream("temp.tmp")));
                    for (int i = 0; i < numOfInts; i++) {
                        out.writeInt(i);
                    }
                    out.close();
                }
            },
            new Tester("Mapped Write") {
                @Override
                public void test() throws IOException {
                    FileChannel fc = new RandomAccessFile("temp.tmp","rw")
                            .getChannel();
                    IntBuffer out = fc
                            .map(FileChannel.MapMode.READ_WRITE,0,fc.size())
                            .asIntBuffer();
                    for (int i = 0; i < numOfInts; i++) {
                        out.put(i);
                    }
                    fc.close();
                }
            },
            new Tester("Stream Read") {
                @Override
                public void test() throws IOException {
                    DataInputStream out = new DataInputStream(
                            new BufferedInputStream(
                                    new FileInputStream("temp.tmp")));
                    for (int i = 0; i < numOfInts; i++) {
                        out.readInt();
                    }
                }
            },
            new Tester("Mapped Read") {
                @Override
                public void test() throws IOException {
                    FileChannel fc = new RandomAccessFile("temp.tmp","rw")
                            .getChannel();
                    IntBuffer out = fc
                            .map(FileChannel.MapMode.READ_WRITE,0,fc.size())
                            .asIntBuffer();
                    for (int i = 0; i < numOfInts; i++) {
                        out.put(i);
                    }
                }
            },
            new Tester("Stream Read/Write") {
                @Override
                public void test() throws IOException {
                    RandomAccessFile raf = new RandomAccessFile(new File("temp3.tmp"),"rw");
                    raf.writeInt(1);
                    for (int i = 0; i < numOfBuffInts; i++) {
                        raf.seek(raf.length() - 4);
                        raf.writeInt(raf.readInt());
                    }
                }
            },
            new Tester("Mapped Read/Write") {
                @Override
                public void test() throws IOException {
                    FileChannel fc = new RandomAccessFile("temp.tmp","rw")
                            .getChannel();
                    IntBuffer out = fc
                            .map(FileChannel.MapMode.READ_WRITE,0,fc.size())
                            .asIntBuffer();
                    out.put(0);
                    for (int i = 1; i < numOfBuffInts; i++) {
                        out.put(out.get(i-1));
                    }
                    fc.close();
                }
            }
    };
    public static void test() {
        for (Tester test : tests) {
            test.runTest();
        }
    }
}
Java编程思想:内存映射文件的更多相关文章
- Java NIO之内存映射文件——MappedByteBuffer
		大多数操作系统都可以利用虚拟内存实现将一个文件或者文件的一部分"映射"到内存中.然后,这个文件就可以当作是内存数组来访问,这比传统的文件要快得多. 内存映射文件的一个关键优势是操作 ... 
- JAVA NIO FileChannel 内存映射文件
		文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ... 
- 内存映射文件(Memory-Mapped File)
		Java Memory-Mapped File所使用的内存分配在物理内存而不是JVM堆内存,且分配在OS内核. 1: 内存映射文件及其应用 - 实现一个简单的消息队列 / 计算机程序的思维逻辑 在一般 ... 
- Java编程的逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列
		本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ... 
- JAVA I/O(三)内存映射文件
		<Java编程思想>中对内存映射文件有详细的介绍,此处仅做简单记录和总结.内存映射文件允许创建和修改因为太大而不能放入内存的文件. 1. 内存映射文件简单实例 import java.io ... 
- Java 内存映射文件
		import java.io.*; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import jav ... 
- Java NIO 内存映射文件
		Java NIO 内存映射文件 @author ixenos 文件操作的四大方法 前提:内存的访问速度比磁盘高几个数量级,但是基本的IO操作是直接调用native方法获得驱动和磁盘交互的,IO速度限制 ... 
- JAVA NIO之浅谈内存映射文件原理与DirectMemory
		JAVA类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原 ... 
- 《Java核心技术卷二》笔记(二)文件操作和内存映射文件
		文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ... 
- Java利用内存映射文件实现按行读取文件
		我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好 ... 
随机推荐
- Index of /android/repository
			放这里了,总是记不住... https://mirrors.zzu.edu.cn/android/repository/ 
- Android零基础入门第37节:初识ListView
			原文:Android零基础入门第37节:初识ListView 之前我们学习的一些UI组件都比较简单,但是在实际开发中,会经常遇见列表界面设计,如通讯录.电话列表.信息列表等.那么从本节开始来详细学习列 ... 
- SQL Server中 SET 和 SELECT 赋值有什么区别?
			SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT.对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们并没有注意,其实这两种 ... 
- Qt使用windows API获取程序运行时占用内存 good
			使用的是psapi.h中的GetProcessMemoryInfo函数,但是运行到该函数时就强制退出了. 后来,百度到原因是 原来Qt编译时加了-mthread,createprocess时要使的Ha ... 
- Mac OS下terminal的快捷键
			时隔2年又开始使用Mac OS系统,之前的很多快捷键和常用的命令都忘记了,使用起来确实不方便,效率也低,特别是terminal下,所以对于terminal又找了一下并整理如下,希望对后来的同学也有用: ... 
- Matlab与.Net混合编程-多维数组赋值出错的问题
			问题描述:Matlab可编译供.net调用的dll.两种不同环境对数据类型的定义相差较大,因此在C#中调用Matlab编译的函数时,首先要将C#中的变量类型转换成与Matlab对应的中转类型.Matl ... 
- 快速删除mysql表中的数据
			一.清空全部数据,不写日志,不可恢复,速度很快 truncate table 表名; 二.清空全部数据,写日志,可恢复,速度很慢 delete from 表名; 
- 简单有趣的hover
			一张图片在鼠标悬浮的时候换另一张图片 平常写张图片用img我们换一种方法用背景,然后就悬浮出 我们在加个边框试试 怎么才能让边框一起换哪? 我们嵌套一下 然后打开就是 是不是一个很简单的hover 
- 重定向Redirect 的知识
			今天下班的时候看到了一些重定向的基础知识,也算开了眼界.以前也经常使用301和302,但从来没有使用过和了解过其他的3XX的状态码,发现原来里面涉及的知识和解决的问题的还不少. 重定向的流程 浏览器首 ... 
- OpenProj打开不了或者提示”Failed to load Java VM Library”的错误的解决方案
			一.双击打开OpenProj.exe没反应的解决方案: 1) 修改OpenProj1.4.0.ini,将Maximum Version=any改为Maximum Version=1.7,保存. 2)这 ... 
