一、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进程直接缓冲区拷贝到堆内存b;
4、如果参数b是直接内存缓冲区,则省略掉步骤三;
内存映射文件原理:
内核地址和用户地址映射到同一个物理地址,这样DMA硬件可以填充对内核和用户空间进程同时可见的缓冲区;
内存映射方式读取文件只执行一次内存拷贝,即磁盘到内核缓冲区,避免调用文件读写系统调用,效率非常高;
MappedByteBuffer细节:
1、RandomAccessFile只维护一个FileChannel实例,实例在调用getChannel时创建,getChannel方法是同步方法;
2、MapMode.PRIVATE模式映射会导致写时拷贝,调用put方法会导致产生一个私有内存副本;
3、MappedByteBuffer是子类DirectByteBuffer实例引用,因此并不消耗JVM堆内存;
4、load方法进行文件预加载,不保证文件一定会全部加载,isLoaded方法表示文件可能已经全部加载到内存;
5、force方法强制将缓冲区的内容写到磁盘上面;
FileChannel细节:
truncate方法在windows上执行失败,在linux上执行成功,文件inode不变;
FileLock细节:
1、FileChannel的lock和trylock方法可以创建文件锁,lock是阻塞方法;
2、文件锁支持区域锁定,shared为true时创建读写锁,操作系统不支持时会创建独占锁,可以使用isShared测试;
3、锁的状态对操作系统的其它进程可见,对进程内的其它线程也可见;
Linux文件锁:
1、sys/file.h的flock,支持独占锁和读写锁,不支持对文件指定区域加锁;
2、unistd.h的lockf,只支持独占锁,不支持对文件指定区域加锁,实际上是调用fcntl;
3、fcntl.h的fcntl,支持独占锁和读写锁,支持对文件指定区域加锁;
4、查看/proc/locks可以查看文件锁信息,FLOCK对应flock,POSIX对应fcntl;
5、默认锁的类型是ADVISORY,即劝告锁,而非强制锁,如果是劝告锁其它进程还是可以操作文件;