`

文件加锁(基于FileChannel)

 
阅读更多
JDK1.4引入了文件加锁机制。它允许我们同步访问某个作为共享资源的文件。不过,竞争同一文件的两个线程可能在不同的Java虚拟机上,或者一个是Java线程,另一个是操作系统中的其他的某个本地线程。文件加锁对其他的操作系统进程是可见的,因为Java的文件加锁直接映射到了本地操作系统的枷锁工具。

通过对FileChannel调用tryLock()或者lock(),就可以获得整个文件的FileLock,其中
tryLock()是非阻塞式的,它设法获得锁,如果不能获得(其他的一些进程已经持有相同的锁,并且不共享),它将直接从方法调用返回。
lock()则是阻塞式的,它要阻塞进程直至锁可以获得,或者调用lock()的线程中断(就是自己先挂掉了),或调用lock()的通道关闭。
使用FileLock.release()可以释放锁

FileOutputStream fos = new FileOutputStream(new File("lock.tct"));

FileLock fl = fos.getChannel().tryLock();

if(fl!=null) {

    XXXX//各种文件操作

    fl.release(); //释放锁

}

fos.close();


也可以通过如下方法对文件的一部分上锁

tryLock(long pos , long size , boolean shared)
lock(long pos , long size , boolean shared)
//加锁的区域由size-position决定。第三个参数指定是否是共享锁


  无参数的加锁方法将根据文件尺寸的变化而变化,而固定尺寸的锁不随文件尺寸的变化而变化。如果你在某一区域上加锁了,那么当文件增大的时候,加锁区域还是那个区域,多出的区域不会被锁定。而无参数的时候,是对整个文件进行加锁,文件变大后,也是对整个文件进行加锁

转自:http://www.linuxidc.com/Linux/2014-10/107586.htm

      http://blog.csdn.net/hbcui1984/article/details/1440226
     
      http://hbcui1984.iteye.com/blog/38524
分享到:
评论

相关推荐

    有效率的读取大文件(2G)

    `FileChannel`可以从文件中读取数据,并与`ByteBuffer`配合使用,实现分块读取。这种方式减少了CPU上下文切换,提高了效率。 ```java FileChannel channel = FileChannel.open(Paths.get("largefile.txt")); ...

    flume中的FileChannel的优化

    经过对Flume FileChannel相关源码的分析,导致FileChannel吞吐率下降的主要原因集中于事务的提交过程——commit

    用netty实现文件传输

    - **零拷贝**:Netty 利用 NIO 的 FileChannel.transferTo 方法,实现了从文件到网络的直接传输,减少了数据拷贝的次数,提高了效率。 - **异步处理**:Netty 的非阻塞 I/O 允许在等待文件传输的同时处理其他任务...

    【IT十八掌徐培成】Java基础第26天-06.FileChannel-RandomAccessFile-CopyFile.zip

    在Java编程语言中,`FileChannel`和`RandomAccessFile`是两个重要的I/O类,它们主要用于处理磁盘文件。这两个类提供了高级的文件操作功能,例如高效的数据传输和随机访问文件内容。在这个主题中,我们将深入探讨这两...

    高效率文件复制java版

    本资源主要讲解了高效率文件复制的java实现方法,包含了两种不同的实现方式,分别使用java io流和FileChannel来实现文件复制操作。 知识点1:Java IO流文件复制 在第一个实现方法中,我们使用了Java IO流来实现...

    文件管理器实现

    首先,Android文件系统是基于Linux的,因此它遵循了Linux的文件组织结构,包括根目录(/)、用户目录(/data/data)以及外部存储(/storage/emulated/0)。开发者需要了解这些目录的作用,以便正确地访问和管理文件...

    java按行读取大文件并解析入库

    为了高效地处理这类问题,我们可以利用Java的`java.nio`包中的BufferedReader和FileChannel等类,实现按行读取大文件,并将其内容解析后存储到数据库中。本文将详细讲解这一过程。 首先,我们需要了解`java.nio`包...

    Netty5多文件、大文件上传源码

    Netty是一个基于Java NIO(非阻塞I/O)的网络通信框架,它提供了一套高效的API,简化了网络编程。Netty的核心是其Channel和EventLoop系统,它们使得处理并发连接变得非常简单。对于大文件和多文件上传,Netty的异步...

    文件的复制

    在Java中,可以利用NIO(New I/O)中的`FileChannel`类和`ByteBuffer`类来进行高效的文件复制。下面将详细介绍这种方法的具体实现。 #### 示例代码解析 以下是一个使用`FileChannel`和`ByteBuffer`进行文件复制的...

    利用java序列化实现基于文件的快速索引

    在“利用java序列化实现基于文件的快速索引”这一主题中,我们将探讨如何利用Java的序列化机制来创建高效的数据索引,从而加速文件数据的检索。 首先,了解Java序列化的基本概念。在Java中,一个类如果实现了`java....

    java基础--文件流管道.docx

    文件通道(FileChannel)是与文件交互的主要接口,它提供了管道传输数据的方法。不同于标准的I/O流,FileChannel并不区分输入和输出,而是提供了一种双向通信的能力。 1. `transferFrom` 方法: `transferFrom()` ...

    NIO(byteBuffer)按行读取文件

    使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com

    java nio 写文件

    要使用NIO写入文件,你需要先创建一个ByteBuffer,然后将数据放入缓冲区,最后调用`FileChannel`的`write()`方法将缓冲区中的数据写入文件。这个过程可以反复进行,直到所有数据都写入文件。以下是一个简单的示例:...

    java 使用IO流实现文件的复制

    Java的IO库基于流的概念,流可以视为数据的序列,可以从源(如键盘、文件)读取到目的地(如显示器、文件)。IO流分为字节流和字符流,字节流处理的是8位的字节数据,而字符流处理的是16位的Unicode字符数据。字节流...

    利用JAVA对STDF文件进行分析_郑立钧

    1. 打开STDF文件,获取文件通道(FileChannel)。 2. 确定文件大小,然后对文件进行映射(map),使其可以在内存中读取。 3. 读取数据记录的头信息,包括记录长度、记录类型和子类型。 4. 根据读取到的头信息类型,...

    文件分割器(IO and NIO 两个版本)

    本项目提供的"文件分割器"包含两个版本,分别是基于传统Java IO(输入/输出流)实现的版本和基于NIO(非阻塞I/O)实现的版本。这两个版本都是在Linux环境下使用Eclipse开发的,因此它们都具有跨平台性,可以在支持...

    java 写文件 java 写文件 java 写文件 java 写文件

    7. **同步写入**:如果多线程环境需要同时写入文件,可以考虑使用FileChannel的锁机制,以防止数据交错。 8. **字符编码**:默认情况下,FileWriter使用平台默认编码。如果需要指定特定编码,可以使用`new ...

    NIO处理大文件

    在Java编程中,传统的I/O模型(Input/Output)在处理大文件时可能会遇到性能瓶颈,因为它们基于阻塞I/O操作,会消耗大量的系统资源并可能导致线程阻塞。为了解决这个问题,Java引入了New Input/Output (NIO) 模型,...

    NIO复制文件

    1. **FileChannel**:`java.nio.channels.FileChannel`是用于读写文件的通道,可以从一个文件通道向另一个文件通道直接传输数据,避免了中间缓冲区的开销。在文件复制中,我们通常使用`transferTo()`和`transferFrom...

    java nio 包读取超大数据文件

    - **FileChannel**:用于与文件进行交互的Channel,提供了读写操作的支持。 #### 三、使用Java NIO读取超大数据文件 在Java NIO中,处理超大数据文件的关键在于合理利用内存映射文件(Memory-Mapped Files)来提高...

Global site tag (gtag.js) - Google Analytics