写入Zip文件系统,其他fs打开

时间:2014-10-27 11:10:17

标签: java concurrency java-7 nio

我想要扫描一个静态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();
    }

1 个答案:

答案 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