java对文件加锁

在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文件。对文件的加锁方法有两种:

第一种方法:使用RandomAccessFile类操作文件。

在java.io.RandomAccessFile类的open方法,提供了参数实现独占的方式打开文件:

        RandomAccessFile raf = new RandomAccessFile(file, "rws");

其中的“rws”参数,rw代表读取和写入,s代表了同步方式,也就是同步锁。这种方式打开的文件,就是独占方式的。

第二种方法:使用sun.nio.FileChannel对文件进行加锁。

代码:

      RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");

      FileChannel fc = raf.getChannel();

      FileLock fl = fc.tryLock();

      if(fl.isValid())

          System.out.println("You have got the file lock.");

以上是通过RandomAccessFile来获得文件锁的,那么在写文件的时候如何对文件加锁呢?方法如下:

代码:

        FileOutputStream fos = new FileOutputStream("file.txt");

        FileChannel fc = fos.getChannel(); //获取FileChannel对象

        FileLock fl = fc.tryLock();  //or fc.lock();

        if(null != fl)

             System.out.println("You have got file lock.");

        //TODO write content to file

        //TODO write end, should release this lock

        fl.release(); //释放文件锁  注意:释放锁要在文件写操作之前,否则会出异常

        fos.close;  //关闭文件写操作

 

如果在读文件操作的时候,对文件进行加锁,怎么操作呢?从API文档中我们可以看到,FileChannel也可以从FileInputStream中直接获得,但是这种直接获得FileChannel的对象直接去操作FileLock会报异常NonWritableChannelException,这样我们又怎么去获得文件锁呢?需要自己去实现getChannel方法,代码如下:

           private static FileChannel getChannel(FileInputStream fin, FileDescriptor fd) {

                  FileChannel channel = null;

                  synchronized(fin){

                        channel = FileChannelImpl.open(fd, true, true, fin);

                        return channel;

                  }

            }

其实,我们看FileInputStream时,发现getChannel方法与我们写的代码只有一个地方不同,即open方法的第三个参数不同,如果设置为false,就不能锁住文件了。缺省的getChannel方法,就是false,因此,不能锁住文件。

特别说明:尊重作者的劳动成果,转载请注明出处哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt208

时间: 2024-09-22 23:15:07

java对文件加锁的相关文章

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.6.3 文件加锁机制

2.6.3 文件加锁机制 考虑一下多个同时执行的程序需要修改同一个文件的情形,很明显,这些程序需要以某种方式进行通信,不然这个文件很容易被损坏.文件锁可以解决这个问题,它可以控制对文件或文件中某个范围的字节的访问. 假设你的应用程序将用户的偏好存储在一个配置文件中,当用户调用这个应用的两个实例时,这两个实例就有可能会同时希望写这个配置文件.在这种情况下,第一个实例应该锁定这个文件,当第二个实例发现这个文件被锁定时,它必须决策是等待直至这个文件解锁,还是直接跳过这个写操作过程. 要锁定一个文件,可

java读文件

/* Readfile.java读取文件的内容,并将原样输出至屏幕上使用方法:java Readfile 文件名*/ import java.io.*; public class Readfile{public static void main(String[] args){byte[] buff = new byte[1024];boolean cont = true;FileInputStream infile = null; // 生成对象infile 准备读取文件try{infile =

java中文件长度的转换

中文|转换 java中文件长度的转换 我们使用java.io.File对象创建一个具体的文件句柄,然后就可以通过这个对象 获取该文件的一些信息了, 但是在我们得到文件长度的时候,返回的是一个long类型的整数, 单位是byte,也就是字节.有时候当文件过大的时候,我们就需要转换成Mb或者 Gb.下面写了个函数实现这个功能: File objFile = new File("c:\\cqq.rar");long filesize=objFile.getLength(); static S

Java实现文件拷贝的测试

经过一组简单的测试发现JAVA NIO提供的文件内存映射方法实现文件拷贝速度最快,不管是大文件还是小文件,特别是大文件的拷贝速度比普通方法提高20倍,唯一有个前提就是内存需要足够大,否则文件映射肯定失败(当然可以通过分割文件,部分映射的方法避免,但就比较麻烦了):其次NIO提供的文件管道传输速度也比较好,如果没法做文件内存映射,推荐这种拷贝方法:另外,Buffer的大小,对于读写速度还是有影响的,基本就是Buffer越大读写越快(有个疑问就是Buffer.allocateDirec()效率提高不

java压缩文件

java的GZIP接口非常简单,所以如果只有单个数据流需要压缩(而不是一系列不同的数据),那么它就可能是最适当选择.下面是对单个文件进行压缩的例子:   //: GZIPcompress.java // Uses Java 1.1 GZIP compression to compress // a file whose name is passed on the command // line. import java.io.*; import java.util.zip.*; public c

java快捷文件处理

由于以前采用的一些典型形式都涉及到文件处理,所以大家也许会怀疑为什么要进行那么多的代码输入--这正是装饰器方案一个缺点.本部分将向大家展示如何创建和使用典型文件读取和写入配置的快捷版本.这些快捷版本均置入packagecom.bruceeckel.tools中(自第5章开始创建).为了将每个类都添加到库内,只需将其置入适当的目录,并添加对应的package语句即可. 7. 快速文件输入 若想创建一个对象,用它从一个缓冲的DataInputStream中读取一个文件,可将这个过程封装到一个名为In

Java遍历文件夹的2种方法

A.不使用递归的方法: import java.io.File; import java.util.LinkedList; public class FileSystem { public static void main(String[] args) { long a = System.currentTimeMillis(); LinkedList list = new LinkedList(); File dir = new File("c:\\Program Files\\Java\\&q

Java读取文件内容的小例子

Java 提供 BufferedReader 类用来从流中读取字符串.FileReader 类用来读取文件.我们用这两个类来读取文件中的字符串. 下面是一个例子: import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;public class ReadFile{ public static void main(String[] args){ String path="c:/1.txt&

PHP使用flock实现文件加锁的方法

  本文实例讲述了PHP使用flock实现文件加锁的方法.分享给大家供大家参考.具体分析如下: flock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows).如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE.锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用). 简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,