Java 内存映射文件
import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.CRC32;
public class Test {
public static void main(String[] args){
MemoryMapTest.test();
}
}
/*
2.6 内存映射文件
2.6.1 内存映射文件的性能
java.nio包使用内存映射的过程:
1.得到一个通道
FileChannel channel = FileChannel.open(path,options);
2.通过map方法从这个通道中获得一个ByteBuffer,可以指定要映射的文件区域与模式
FileChannel.MapMode.READ_ONLY:
FileChannel.MapMode.READ_WRITE:
FileChannel.MapMode.PRIVATE:
3.通过ByteBuffer读写数据
//顺序遍历缓冲区所有字节
while(buffer.hasRemaining()){
byte b = buffer.get();
...
}
//随机访问缓冲区字节
for(int i =0; i<buffer.limit(); i++)
byte b = buffer.get(i);
...
}
//读写字节数组
get(byte[] bytes)
get(byte[] bytes, int offset, int len)
getInt,getLong,getShort,getChar,getFloat,getDouble,order
buffer.order(ByteOrder.LITTLE_ENDIAN);
*/
class MemoryMapTest{
/*
待会找到Java编程思想中关于CRC32的用法,对比一下
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
ZipOutputStream zos = new ZipOutputStream(csum);
*/
public static long checksumInputStream(Path filename){
try(InputStream in = Files.newInputStream(filename)) {
CRC32 crc = new CRC32();
int c;
while((c=in.read())!=-1){
crc.update(c);
}
return crc.getValue();
} catch (IOException e) {
e.printStackTrace();
}
return 0L;
}
public static long checksumBufferedInputStream(Path filename){
try(InputStream in = new BufferedInputStream(Files.newInputStream(filename))){
CRC32 crc = new CRC32();
int c;
while((c=in.read())!=-1){
crc.update(c);
}
return crc.getValue();
} catch (IOException e) {
e.printStackTrace();
}
return 0L;
}
public static long checksumRandomAccseeFile(Path filename){
try(RandomAccessFile file = new RandomAccessFile(filename.toFile(),"r")) {
long length = file.length();
CRC32 crc = new CRC32();
for(long p=0;p<length;p++){
file.seek(p);
int c= file.readByte();
crc.update(c);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return 0L;
}
public static long checksumMappedFile(Path filename){
try(FileChannel channel = FileChannel.open(filename)) {
CRC32 crc = new CRC32();
int length = (int)channel.size();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY,0,length);
for (int p = 0; p < length; p++) {
int c = buffer.get(p);
crc.update(c);
}
return crc.getValue();
} catch (IOException e) {
e.printStackTrace();
}
return 0L;
}
public static void test(){
Path filename = Paths.get("./temp.tmp");
//InputStream
System.out.println("InputStream:");
long start = System.currentTimeMillis();
long crcValue = checksumInputStream(filename);
long end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end-start)+" milliseconds");
//RandomAccessFile
System.out.println("RandomAccessFile:");
start = System.currentTimeMillis();
crcValue = checksumRandomAccseeFile(filename);
end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end-start)+" milliseconds");
//BufferedInputStream
System.out.println("BufferedInputStream:");
start = System.currentTimeMillis();
crcValue = checksumBufferedInputStream(filename);
end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end-start)+" milliseconds");
//Mapped
System.out.println("InputStream:");
start = System.currentTimeMillis();
crcValue = checksumMappedFile(filename);
end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end-start)+" milliseconds");
}
}
/*
2.6.2 缓冲区数据结构
每个缓冲区都具有:
1.一个容量,它永远不能被改变
2.一个读写位置,写一个值将在此读写
3.一个界限,超过它进行读写是没有意义的
4.一个可选的标记,用于重复一个读入或写出操作
0<=标记<=位置<=界限<=容量
*/
/*
2.6.3 文件加锁机制
FileLock lock = channel.lock();
FileLock lock = channel.tryLock();
FileLock lock(long start,long size,boolean shared)
FileLock tryLock(long start, long size,boolean shared)
如果shared的标志为false,则锁定文件的目的是读写,如果为true,则这是一个共享锁,
它允许多个进程从文件中读入,并阻止任何进程获得独占的锁。调用FileLock类的isShared
方法可以查询你持有的锁的类型。
*/
《Java核心技术卷二》笔记
Java 内存映射文件的更多相关文章
- java内存映射文件
内存映射文件能够让我们创建和修改大文件(大到内存无法读入得文件),对于内存映射文件,我们可以认为是文件已经全部被读入到内存当中,然后当成一个大的数字来访问,简化修改文件的代码. 1.directBuf ...
- 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)
1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...
- 内存映射文件(Memory-Mapped File)
Java Memory-Mapped File所使用的内存分配在物理内存而不是JVM堆内存,且分配在OS内核. 1: 内存映射文件及其应用 - 实现一个简单的消息队列 / 计算机程序的思维逻辑 在一般 ...
- 使用Java内存映射(Memory-Mapped Files)处理大文件
>>NIO中的内存映射 (1)什么是内存映射文件内存映射文件,是由一个文件到一块内存的映射,可以理解为将一个文件映射到进程地址,然后可以通过操作内存来访问文件数据.说白了就是使用虚拟内存将 ...
- 《Java核心技术卷二》笔记(二)文件操作和内存映射文件
文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...
- Java NIO之内存映射文件——MappedByteBuffer
大多数操作系统都可以利用虚拟内存实现将一个文件或者文件的一部分"映射"到内存中.然后,这个文件就可以当作是内存数组来访问,这比传统的文件要快得多. 内存映射文件的一个关键优势是操作 ...
- Java NIO 内存映射文件
Java NIO 内存映射文件 @author ixenos 文件操作的四大方法 前提:内存的访问速度比磁盘高几个数量级,但是基本的IO操作是直接调用native方法获得驱动和磁盘交互的,IO速度限制 ...
- Java利用内存映射文件实现按行读取文件
我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好 ...
- Java编程的逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
随机推荐
- vfp9写的爬虫前段,基于webbrowser
*基于xmlhttp不能正确获取js动态加载的数据 CLEAR ALL CLEAR PUBLIC zform zform = CREATEOBJECT([myform])zform.go(" ...
- ARTS 12.24 - 12.28
从陈皓博主的专栏里学到一个概念,争取可以坚持下去: 每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! 一个 Algori ...
- Application.StartupPath和System.Environment.CurrentDirectory的区别
System.Environment.CurrentDirectory的含义是获取或设置当前工作路径,而Application.StartupPath是获取程序启动路径,表面上看二者没什么区别,但实际 ...
- Git的HTTP proxy设置方法
今天用git push代码到Github死活上不去,最后设置了Http代理才上去了,在这小记一下设置方法 1.依次打开:项目地址-->.git(可能要选择显示隐藏文件夹才能看到)-->co ...
- Qt5.5.0在Linux下静态编译(加上-fontconfig编译项才能显示中文) good
测试系统环境:Ubuntu12.04 (32bit/64bit)编译软件环境:QT5.5.0 本文章主要介绍Linux下QT静态编译环境的搭建,以及如何编译我们的程序board_driver. 1 ...
- Qt4.85静态编译配置VS动态编译(非常详细的图文教程)
http://www.qter.org/forum.php?mod=viewthread&tid=1409&extra=page%3D1&page=1
- Screensiz.es站收集整理了移动端的相关尺寸。
Screensiz.es站收集整理了移动端的相关尺寸. Screensiz.es 彩蛋爆料直击现场 Screensiz.es站收集整理了移动端的相关尺寸.
- QML学习【一】Basic Types
QML入门教程(1) QML是什么? QML是一种描述性的脚本语言,文件格式以.qml结尾.语法格式非常像CSS(参考后文具体例子),但又支持javacript形式的编程控制.它结合了QtDesi ...
- vista下开机启动 简单绕过UAC的方法(自己使用runas参数重新启动自己,有点意思)
背景 vista下,如果不开启UAC,那就没有我下面要说的问题了,呵呵.下面说的都是在vista开启UAC的前提下说的,win7也适用. 在vista下,系统开启了UAC,如果你的 ...
- ansible(二)
一.软件相关模块 1.yum(下载包) 正常操作 yum 与rpm的区别 yum可以解决依赖关系rpm 全称readhat package manager(红帽包管理工具),需要自己解决依赖 yum源 ...