我有一个使用FileReader打开文件的Java进程.如何防止另一个(Java)进程打开此文件,或者至少通知第二个进程该文件已被打开?如果文件是打开的(这解决了我的问题),这是否会自动使第二个进程获得异常,或者我是否必须在第一个进程中使用某种标志或参数显式打开它?
我有一个Java应用程序,它列出了一个文件夹,并打开列表中的每个文件进行处理.它会逐个处理每个文件.每个文件的处理包括读取它并根据内容进行一些计算,大约需要2分钟.我还有另一个Java应用程序执行相同的操作,而是写入文件.我想要的是能够同时运行这些应用程序,所以场景就是这样的.ReadApp列出文件夹并找到文件A,B,C.它打开文件A并开始读取.WriteApp列出文件夹并找到文件A,B,C.它打开文件A,看到它是打开的(通过异常或任何方式)并转到文件B. ReadApp完成文件A并继续到B.它看到它是开放的,继续到C. WriteApp没有至关重要 当ReadApp读取同一文件时写入,反之亦然.它们是不同的过程.
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"的部分.
不要使用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) { }
如果您可以使用Java NIO(JDK 1.4或更高版本),那么我认为您正在寻找java.nio.channels.FileChannel.lock()
FileChannel.lock()
将java.nio.channels.FileLock与java.nio.channels.FileChannel结合使用
这可能不是你想要的,但是为了从另一个角度来解决问题....
这两个Java进程是否可能要在同一个应用程序中访问同一个文件?也许您可以通过单个同步方法(或者甚至更好地使用JSR-166)过滤对文件的所有访问?这样,您就可以控制对文件的访问,甚至可以控制队列访问请求.