我有一个使用FileReader打开文件的Java进程。如何防止另一个(Java)进程打开该文件,或者至少通知第二个进程该文件已经打开?如果文件是打开的(这解决了我的问题),这是否会自动使第二个进程获得异常,还是必须在第一个进程中使用某种标志或参数显式打开它?
澄清一下:
我有一个Java应用程序,它列出了一个文件夹,并打开列表中的每个文件进行处理。它一个接一个地处理每个文件。每个文件的处理包括读取它并根据内容进行一些计算,大约需要2分钟。我还有另一个Java应用程序,它做同样的事情,只是在文件上写东西。我想要的是能够同时运行这些应用程序,所以场景是这样的。ReadApp列出文件夹并找到文件A、B、C。它打开文件A并开始读取。WriteApp列出文件夹并找到文件A、B、C。它打开文件A,看到它是打开的(异常或以任何方式),然后转到文件B。ReadApp完成文件A并继续到B。它看到它是打开的,并继续到C。至关重要的是,当WriteApp读取相同的文件时,ReadApp不写入,反之亦然。它们是不同的进程。
发布于 2008-09-24 16:20:47
FileChannel.lock可能就是您想要的。
try (
FileInputStream in = new FileInputStream(file);
java.nio.channels.FileLock lock = in.getChannel().lock();
Reader reader = new InputStreamReader(in, charset)
) {
...
}
(免责声明:代码没有编译,当然也没有经过测试。)
请注意API doc for FileLock中标题为“平台依赖项”的部分。
发布于 2012-01-26 23:20:34
不要使用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) {
}
发布于 2008-09-24 16:14:07
https://stackoverflow.com/questions/128038
复制相似问题