Java 锁定本地FS上的文件
我正在构建一个Java应用程序来处理本地FS(NTFS)上的文件,但是一个允许将来轻松扩展到Linux文件系统的解决方案会很好。问题是,如果我的应用程序的两个实例(进程)同时运行,那么一个文件不能被多次处理 似乎我需要在处理之前锁定每个文件。应用程序不使用数据库,仅为了锁定而使用数据库似乎并不方便 所以我想在文件名后面加一个后缀。问题是,如何(如果可能的话)询问文件名是否以后缀结尾,然后以原子方式追加后缀Java 锁定本地FS上的文件,java,concurrency,filesystems,Java,Concurrency,Filesystems,我正在构建一个Java应用程序来处理本地FS(NTFS)上的文件,但是一个允许将来轻松扩展到Linux文件系统的解决方案会很好。问题是,如果我的应用程序的两个实例(进程)同时运行,那么一个文件不能被多次处理 似乎我需要在处理之前锁定每个文件。应用程序不使用数据库,仅为了锁定而使用数据库似乎并不方便 所以我想在文件名后面加一个后缀。问题是,如何(如果可能的话)询问文件名是否以后缀结尾,然后以原子方式追加后缀 我也很欣赏实现我所需要的其他技巧。您也许可以利用这样一个事实,即文件重命名操作在大多数文件
我也很欣赏实现我所需要的其他技巧。您也许可以利用这样一个事实,即文件重命名操作在大多数文件系统上都是原子的。你的逻辑可能是这样的:
您也许可以利用这样一个事实:在大多数文件系统上,文件重命名操作是原子的。你的逻辑可能是这样的:
你到那儿了吗?你到那儿了吗?像这样的方法应该行得通:
File someFile = new File(path);
if ( !someFile.getName().endsWith(".locked") ) {
File lockedFile = new File(someFile.getAbsolutePath() + ".locked");
someFile.renameTo(lockedFile);
}
像这样的方法应该会奏效:
File someFile = new File(path);
if ( !someFile.getName().endsWith(".locked") ) {
File lockedFile = new File(someFile.getAbsolutePath() + ".locked");
someFile.renameTo(lockedFile);
}
因为“测试并重命名”操作不是原子的,所以这真的会起作用还是会有竞争条件?因为“测试并重命名”操作不是原子的,所以这真的会起作用还是会有竞争条件?我想我会这样做。谢谢我想我会走这条路。谢谢为什么不以独占模式打开文件并使其保持打开状态(另一个实例届时将无法打开)?为什么不以独占模式打开文件并使其保持打开状态(另一个实例届时将无法打开)?