java io buffer状态_RandomAccessFile用法 MappedByteBuffer详解 共享内存

一、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,即劝告锁,而非强制锁,如果是劝告锁其它进程还是可以操作文件;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值