Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >FileChannel和文件锁

FileChannel和文件锁

作者头像
alexqdjay
发布于 2018-05-11 05:55:01
发布于 2018-05-11 05:55:01
1.7K00
代码可运行
举报
文章被收录于专栏:alexqdjayalexqdjay
运行总次数:0
代码可运行

FileChannel

FileChannel 可以通过 RandomAccessFile 获取,或者FileChannel.open,亦或 IS/OS 获取。write 和 read 都是通过 ByteBuffer 来存储。

FileChannel.open 时可以提供 OpenOption 来定义行为,如果需要写的话可以使用 write 和 append 模式,在不确定文件是否存在是加入 Create,这样如果不存在会自动创建。

write 和 append 有什么区别?

这两种模式声明的不是 FileChannel 的模式,而是声明那个文件的打开模式,作为 FileChannel 只顾自己position 增加,在 write 模式下文件的 postion 跟 Channel 的 position 是一致的,但是在 append 模式下文件 position 跟 Channel 的完全脱节,两者都是自顾自增加。

说到这里你可能已经想到,如果要实现每次输入内容覆盖之前的话,必须选择 Write 模式,并且每次 channel.write 前都需要将channel的 position 置为零。

文件锁 Lock

FileChannel.lock  和  tryLock  从文档上看一个是同步阻塞、另一个是非阻塞。

tryLock 在同一个JVM中不同线程获取时,先到先得,后到的返回null,但我在windows上测试为抛出异常:OverlappingFileLockException ,据说 Linux 上抛出【java.io.IOException:Permission denied】。

tryLock 和 lock 都提供一个API含有三个参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lock(long position,
            long size,
            boolean shared)

看样子貌似可以锁住部分似的,可能跟操作系统有关,反正windows上并不行,抛出异常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.io.IOException: 另一个程序已锁定文件的一部分,进程无法访问。

共享锁,独占锁概念上跟并发的 WriteReadLock 一样可多读但只一写,写是独占的。

怎么设置?看上面API第三个参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lock(long position,
            long size,
            boolean shared) // 是否共享锁

如何判断获取到的是什么锁?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FileLock.isShared()

实现靠谱的文件锁

主要就是一个循环判断加try.catch

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
       while (true) {
           try {
              lock = fc.lock();
              break;
           } catch (OverlappingFileLockException e) {
              Thread.sleep(1 * 1000);
           }
        }

这可以让需要获取锁的代码块阻塞在那里,当然咯,如果想 wait 也是可以的,只是要在 release 的地方加上 notifyAll 了。

内存映射文件

这个可谓 “大杀器”,特别是大文件读写时,效率比普通IO要快N倍。据一位网友测试86M的文件进行读操作,内存映射方式只要78ms,而普通IO需要468ms,差了6倍。可见威力无穷。

为什么这么快?

普通IO是操作系统先读入到内核缓冲器,再转到用户进程私有的内存区,当然JVM进程还作了内核态和用户态的切换;而内存映射方式,是将文件直接映射到内存中的一块区域,当调用读时会抛出缺页异常,OS会读取该页数据,依次往复,因此这里少了依次内核缓冲区到私有内存之间的拷贝,所以快了不少。

内存映射模式

  1. read_only,只读设置
  2. read_write,读写都可,并且任何写操作立即反应在文件上,其他共享该文件的内存映射也能立即看到
  3. private,私有模式,不写时跟read_only 一样,但是写时会克隆一个独立内存区域,不会影响文件。

代码片段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
File file = new File("E:\\test.txt");  
FileInputStream in = new FileInputStream(file);  
FileChannel channel = in.getChannel();  
MappedByteBuffer mappedBuffer = channel.map(FileChannel.MapMode.READ_ONLY, 0,channel.size());
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊一聊Java中的文件锁
当读写文件时,需要确保有适当的文件锁定机制,来保证基于并发I/O应用程序的数据完整性。
良月柒
2020/03/17
2.9K0
文件操作之 FileChannel 与 mmap
Java 中原生读写方式大概可以被分为三种:普通 IO,FileChannel(文件通道),mmap(内存映射)。
leobhao
2023/03/11
1.5K0
文件操作之 FileChannel 与 mmap
java 文件锁[通俗易懂]
今天在分析HDFS数据节点的源码时,了解到在数据节点的文件结构中,当数据节点运行时,${dfs.data.dir}下会有一个名为”in_use.lock”的文件,该文件就是文件锁。
全栈程序员站长
2022/09/13
9530
Java持久化之 -- 傲娇的NIO
xxxBuffer buffer = xxxBuffer.allocate(最大容量);
房上的猫
2019/01/24
5260
Java持久化之 -- 傲娇的NIO
python filelock 文件锁_详解进程文件锁FileLock
* FileLocke是文件锁,进程锁,控制不同程序(JVM)对同一文件的并发访问
全栈程序员站长
2022/09/13
1.5K0
NIO 之 FileChannel
概述 文件通道总是阻塞式的,因此不能被置于非阻塞模式。现代操作系统都有复杂的缓存和预取机制,使得本地磁盘 I/O 操作延迟很少。网络文件系统一般而言延迟会多些,不过却也因该优化而受益。 面向流的 I/O 的非阻塞范例对于面向文件的操作并无多大意义,这是由文件 I/O 本质上的不同性质造成的。对于文件 I/O,最强大之处在于异步 I/O( asynchronous I/O),它允许一个进程可以从操作系统请求一个或多个 I/O 操作而不必等待这些操作的完成。发起请求的进程之后会收到它请求的 I/O 操作已完成的
java404
2018/06/13
7940
「高并发通信框架Netty4 源码解读(五)」NIO通道Channel详解
通道可以形象地比喻为银行出纳窗口使用的气动导管。您的薪水支票就是您要传送的信息,载体(Carrier)就好比一个缓冲区。您先填充缓冲区(将您的支票放到载体上),接着将缓冲“写”到通道中(将载体丢进导管中),然后信息负载就被传递到通道另一侧的 I/O 服务(银行出纳员)。该过程的回应是:出纳员填充缓冲区(将您的收据放到载体上),接着开始一个反方向的通道传输(将载体丢回到导管中)。载体就到了通道的您这一侧(一个填满了的缓冲区正等待您的查验),然后您就会 flip 缓冲区(打开盖子)并将它清空(移除您的收据)。现在您可以开车走了,下一个对象(银行客户)将使用同样的载体(Buffer)和导管(Channel)对象来重复上述过程。
源码之路
2020/09/04
6830
「高并发通信框架Netty4 源码解读(五)」NIO通道Channel详解
JAVA NIO FileChannel 内存映射文件
文件通道不能创建,只能通过(RandomAccessFile、FileInputStream、FileOutputStream)getChannel()获得,具有与File形同的访问权限。
WindWant
2020/09/11
1.5K0
JAVA NIO FileChannel 内存映射文件
JAVA 文件锁 FileLock
概述 FileLock是java 1.4 版本后出现的一个类,它可以通过对一个可写文件(w)加锁,保证同时只有一个进程可以拿到文件的锁,这个进程从而可以对文件做访问;而其它拿不到锁的进程要么选择被挂起等待,要么选择去做一些其它的事情, 这样的机制保证了众进程可以顺序访问该文件。也可以看出,能够利用文件锁的这种性质,在一些场景下,虽然我们不需要操作某个文件, 但也可以通过 FileLock 来进行并发控制,保证进程的顺序执行,避免数据错误。 共享锁、独占锁 共享锁:允许多个线程进行文件的读取操作 独占锁:
java404
2018/05/18
3.7K0
NIO--FileLock,Path,Files,AsynchronousFileChannel,Charset
如果指定为共享锁,则其它进程可读此文件,所有进程均不能写此文件,如果某进程试图对此文件进行写操作,会抛出异常。
大忽悠爱学习
2021/12/13
6530
Java.NIO编程一览笔录
Java标准IO 与 Java NIO 的简单差异示意: Java标准IO Java NIO API调用 简单 复杂 底层实现 面向流(stream),单向 面向通道(channel),释放CPU、内存压力 成效 同步阻塞 同步非阻塞 数据窥视 阻塞读取,要么足够,要么没有 使用缓冲区(Buffer), 读数据时需要检查是否足够 处理数据的线程数 1:1(一个线程处理一个流) 1:N(选择器(Selector),多路复用,可以一个或几个少量线程管理多个通道) Java N
斯武丶风晴
2018/03/01
1.3K0
Java.NIO编程一览笔录
NIO之通道Channel【FileChannel介绍】
  Channel是一个对象,作用是用于源节点和目标节点的连接,在java NIO中负责缓冲区数据的传递。Channel本身不存储数据,因此需要配合缓冲区进行传输。
用户4919348
2019/04/18
6370
NIO之通道Channel【FileChannel介绍】
java nio剖析
java nio 的全称是 java new I/O ,即一个全新的 I/O 控制系统,它的 API 的包名为 java.nio ,是在 jdk1.4 后引入的。
全栈程序员站长
2021/05/19
4740
Java核心技术卷2 高级特性 学习笔记(2)
对象序列化是以特殊的文件格式存储对象数据的。当存储一个对象时,这个对象所属的类也必须存储。这个类的描述包含:
2019/02/25
6590
Java NIO文件锁和可中断通道【源码笔记】
小结:begin()操作即可中断线程的实现过程,在当前线程中注入Interruptible实例,当线程中断时对Interruptible进行回调;回调实现了关闭channel,释放锁操作。
瓜农老梁
2020/02/18
6530
Java NIO文件锁和可中断通道【源码笔记】
跨进程文件锁 - FileChannel
当有多个进程或者多个应用同时操作文件时 , 会并行往文件中写入字节 , 如何保证多个进程中文件写入或者操作当原子性就很重要.
None_Ling
2020/09/17
1.7K0
NIO之Channel通道(一)-Channel、FileChannel
Channel叫做通道,用于I/O操作的连接。与Stream不同,可以双向的进行数据通信。
云飞扬
2022/04/25
5470
JavaNIO快速入门
NIO是Jdk中非常重要的一个组成部分,基于它的Netty开源框架可以很方便的开发高性能、高可靠性的网络服务器和客户端程序。本文将就其核心基础类型Channel, Buffer, Selector进行
用户1216676
2018/01/24
1.9K0
掌握这5个技巧,彻底掌握Netty中的零拷贝!
Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级分为4个,Linux 使用 Ring 0 和 Ring 3。
Java程序猿
2021/03/15
1.2K0
你真的理解零拷贝了吗?
从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能;这个词我们也经常在java nio,netty,kafka,RocketMQ等框架中听到,经常作为其提升性能的一大亮点;下面从I/O的几个概念开始,进而在分析零拷贝。
Bug开发工程师
2019/05/05
8951
你真的理解零拷贝了吗?
相关推荐
聊一聊Java中的文件锁
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文