首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用java锁定文件(如果可能)

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

Stack Overflow用户
提问于 2008-09-24 15:59:23
回答 7查看 173.9K关注 0票数 128

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

澄清一下:

我有一个Java应用程序,它列出了一个文件夹,并打开列表中的每个文件进行处理。它一个接一个地处理每个文件。每个文件的处理包括读取它并根据内容进行一些计算,大约需要2分钟。我还有另一个Java应用程序,它做同样的事情,只是在文件上写东西。我想要的是能够同时运行这些应用程序,所以场景是这样的。ReadApp列出文件夹并找到文件A、B、C。它打开文件A并开始读取。WriteApp列出文件夹并找到文件A、B、C。它打开文件A,看到它是打开的(异常或以任何方式),然后转到文件B。ReadApp完成文件A并继续到B。它看到它是打开的,并继续到C。至关重要的是,当WriteApp读取相同的文件时,ReadApp不写入,反之亦然。它们是不同的进程。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-09-24 16:20:47

FileChannel.lock可能就是您想要的。

代码语言:javascript
复制
try (
    FileInputStream in = new FileInputStream(file);
    java.nio.channels.FileLock lock = in.getChannel().lock();
    Reader reader = new InputStreamReader(in, charset)
) {
    ...
}

(免责声明:代码没有编译,当然也没有经过测试。)

请注意API doc for FileLock中标题为“平台依赖项”的部分。

票数 119
EN

Stack Overflow用户

发布于 2012-01-26 23:20:34

不要使用java.io包中的类,而要使用java.nio包。后者有一个FileLock类。您可以将锁定应用于FileChannel

代码语言:javascript
复制
 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) {
    }
票数 63
EN

Stack Overflow用户

发布于 2008-09-24 16:14:07

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/128038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档