RandomAccessFile使用详解 MappedByteBuffer使用详解 共享内存
- 2020-06-04 21:05:00
- admin
- 原创 2986
一、RandomAccessFile使用详解
1、用于随机读和随机写;
2、提供多种数据类型的读和写;
特殊说明:
bytes = new byte[8];
output.write(bytes, 0, 0); //可以写0字节
byte[] bytes = null;
output.write(bytes, 0, 0); //会触发抛异常
二、MappedByteBuffer使用详解
FileInputStream.read(byte b[])执行过程:
1、从磁盘拷贝到内核缓冲区;
2、从内核缓冲区拷贝到JVM直接缓冲区;
3、从JVM直接缓冲区拷贝到堆内存;
4、如果参数是直接缓冲区,则省略步骤三;
内存映射文件原理:
1、内核地址和用户地址映射到同一个物理地址,这样DMA硬件可以填充对内核和用户空间进程同时可见的缓冲区;
2、内存映射方式读取文件只执行一次内存拷贝,即磁盘到内核缓冲区,避免调用文件操作系统调用,效率非常高;
MappedByteBuffer实现细节:
1、RandomAccessFile维护一个FileChannel实例,实例在调用getChannel时创建,getChannel方法是同步方法;
2、MapMode.PRIVATE映射模式会导致写时拷贝,调用写操作会导致产生私有内存副本;
3、MappedByteBuffer实际是子类DirectByteBuffer实例,因此并不消耗JVM堆内存;
4、load方法进行文件预加载,不保证文件一定全部加载,isLoaded方法表示文件可能已经全部加载;
5、force方法强制将缓冲区的内容写到磁盘上面;
6、示例代码:SharedMemory.java
FileChannel实现细节:
truncate方法在windows上执行失败,在linux上执行成功,文件inode不变;
FileLock实现细节:
1、FileChannel的lock和trylock方法可以创建文件锁,lock是阻塞方法;
2、文件锁支持区域锁定,shared为true时创建读写锁,操作系统不支持时会创建独占锁,可以使用isShared测试;
3、锁的状态对操作系统的其他进程可见,对进程内的其他线程也可见;
Linux文件锁:
1、sys/file.h的flock,支持独占锁和读写锁,不支持对文件指定区域加锁;
2、fcntl.h的fcntl,支持独占锁和读写锁,支持对文件指定区域加锁;
3、unistd.h的lockf,只支持独占锁,不支持对文件指定区域加锁,实际调用fcntl;
4、查看/proc/locks可以查看文件锁信息,FLOCK对应flock,POSIX对应fcntl;
5、默认锁的类型是劝告锁ADVISORY,而非强制锁,如果是劝告锁其他进程还是可以操作文件;