当前位置:  开发笔记 > 编程语言 > 正文

如何使用java锁定文件(如果可能)

如何解决《如何使用java锁定文件(如果可能)》经验,为你挑选了5个好方法。

我有一个使用FileReader打开文件的Java进程.如何防止另一个(Java)进程打开此文件,或者至少通知第二个进程该文件已被打开?如果文件是打开的(这解决了我的问题),这是否会自动使第二个进程获得异常,或者我是否必须在第一个进程中使用某种标志或参数显式打开它?

澄清:

我有一个Java应用程序,它列出了一个文件夹,并打开列表中的每个文件进行处理.它会逐个处理每个文件.每个文件的处理包括读取它并根据内容进行一些计算,大约需要2分钟.我还有另一个Java应用程序执行相同的操作,而是写入文件.我想要的是能够同时运行这些应用程序,所以场景就是这样的.ReadApp列出文件夹并找到文件A,B,C.它打开文件A并开始读取.WriteApp列出文件夹并找到文件A,B,C.它打开文件A,看到它是打开的(通过异常或任何方式)并转到文件B. ReadApp完成文件A并继续到B.它看到它是开放的,继续到C. WriteApp没有至关重要 当ReadApp读取同一文件时写入,反之亦然.它们是不同的过程.



1> Tom Hawtin -..:

FileChannel.lock可能就是你想要的.

FileInputStream in = new FileInputStream(file);
try {
    java.nio.channels.FileLock lock = in.getChannel().lock();
    try {
        Reader reader = new InputStreamReader(in, charset);
        ...
    } finally {
        lock.release();
    }
} finally {
    in.close();
}

(免责声明:代码未编译,当然未经过测试.)

请注意FileLock的API文档中标题为"platform dependencies"的部分.


更重要的是,要了解JVM的锁定,并且不适合锁定文件以供单个JVM中的各个线程访问.
是的,我尝试了它并抛出`NonWritableChannelException`,因为`lock()`尝试获取独占锁,但这需要写访问权.如果你有一个**输入**流,你可以使用`lock(0L,Long.MAX_VALUE,false)`获取共享锁,只需要一个读访问权限.如果你想在阅读时想要一个独占锁,你也可以使用在读写模式下打开的`RandomAccessFile`但这样会禁止并发读者.
你需要一个可写的流(即`FileOutputStream`).
@Javier我想你的意思是说`lock(0L,Long.MAX_VALUE,true)`,而不是`lock(0L,Long.MAX_VALUE,false)`.最后一个参数是`boolean shared` http://docs.oracle.com/javase/8/docs/api/java/nio/channels/FileChannel.html#lock-long-long-boolean-

2> ayengin..:

不要使用java.io包中的类,而是使用java.nio包.后者有一个FileLock班级.你可以锁定一个FileChannel.

 try {
        // Get a file channel for the file
        File file = new File("filename");
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

        // Use the file channel to create a lock on the file.
        // This method blocks until it can retrieve the lock.
        FileLock lock = channel.lock();

        /*
           use channel.lock OR channel.tryLock();
        */

        // Try acquiring the lock without blocking. This method returns
        // null or throws an exception if the file is already locked.
        try {
            lock = channel.tryLock();
        } catch (OverlappingFileLockException e) {
            // File is already locked in this thread or virtual machine
        }

        // Release the lock - if it is not null!
        if( lock != null ) {
            lock.release();
        }

        // Close the file
        channel.close();
    } catch (Exception e) {
    }



3> KC Baltz..:

如果您可以使用Java NIO(JDK 1.4或更高版本),那么我认为您正在寻找java.nio.channels.FileChannel.lock()

FileChannel.lock()


也许.取决于'过程'所指的OP意味着什么."代表整个Java虚拟机保存文件锁.它们不适合控制同一虚拟机中多个线程对文件的访问."
@Harry他引用了文档:http://download.oracle.com/javase/6/docs/api/java/nio/channels/FileLock.html这意味着它对线程是不可见的,但会影响其他进程.

4> Matt..:

将java.nio.channels.FileLock与java.nio.channels.FileChannel结合使用



5> pkaeding..:

这可能不是你想要的,但是为了从另一个角度来解决问题....

这两个Java进程是否可能要在同一个应用程序中访问同一个文件?也许您可以通过单个同步方法(或者甚至更好地使用JSR-166)过滤对文件的所有访问?这样,您就可以控制对文件的访问,甚至可以控制队列访问请求.


两个进程不能使用同步,只有两个线程在同一进程中.
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有