我想要扫描一个静态Path属性来扫描子文件,这个Path引用了一个zip文件,我无法关闭它,因为它会被随机引用。在某些方面,我需要写入zip文件。问题是我不想关闭文件系统,因为Path属性需要打开以供将来阅读,如果我不关闭它,我看不到写入的更改。如果我尝试创建另一个引用相同路径的文件系统,我会得到FileSystemAlreadyExistsException。我可以在写完之后关闭fs然后再打开它,但是有一个人可能会尝试在此刻读取Path。 有一个解决方法?为什么我不需要关闭默认的FileSystem来查看写入的文件,我需要使用zip文件系统?
public static void copyTree(final Path source, final Path targetPath) throws IOException {
FileSystem fs = FileSystems.getFileSystem(targetPath.toUri());
Files.walkFileTree(source, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Files.copy(dir, targetPath, StandardCopyOption.REPLACE_EXISTING);
return super.preVisitDirectory(dir, attrs);
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING);
return super.visitFile(file, attrs);
}
});
//if I don't close the FileSystem here the changes won't appear.
fs.close();
}
答案 0 :(得分:0)
你没有关闭“文件系统”,你可以关闭一个文件 - 这些是完全不同的东西。 FileSystemAlreadyExistsException
只是名字不好 - 无法完全用java,AFAIK关闭/卸载文件系统,请停止使用“filesystem”这个文件,这非常令人困惑。
回答你的问题:如果我设法正确解密它,你想知道从多个线程访问一个文件,那是不是很正确?
在这种情况下,最简单的解决方案是:将对文件的访问权限包装到新类中,使类成为singleton和每个写入方法synchronized。这样每个写操作都会阻塞,直到最后一个完成 - 使用一个关闭文件的附加方法,你甚至可以以受控的方式关闭你的应用程序:http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html,你也可以使用try-with-resources代替nio方法调用抛出异常
我认为.property文件的这个小例子可能带有这样的想法:Load Properties File in Singleton Class