Java nio2:映射文件系统之间的Path对象,而不依赖于toString

时间:2012-10-03 20:46:55

标签: java zipfile nio2

我正在使用NIO2从源目录的内容创建一个zip文件。我正在使用ZipFileSystem,我首先必须获得一个实例,然后生成路径。然后,可以使用生成的路径使用Files.createDirectory(pathInZip)Files.copy(sourcePath, destPathInZip)在zip文件中创建条目。这样做很好,但是我想避免一些丑陋的时刻:

 // within the SimpleFileVisitor that walks through sourceDirFile
 @Override
 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    Path pathInZip = zipFileSystem.getPath(sourceDirPath.relativize(file).toString()); // <-- ?!
    Files.copy(file, pathInZip);
    return FileVisitResult.CONTINUE;
 }

有没有办法可以将Path从一个FileSystemProvider复制到另一个Path而不依赖aPath.toString()?看起来很难看。我总是可以迭代一条路径,逐步构建另一条路径......但是我花了很多时间写这篇文章似乎很容易有一个FileSystem.getPath(Path anotherPath)。

2 个答案:

答案 0 :(得分:1)

我一直在使用dirutils lib下面,我认为你正在尝试做什么。它使用toPath.resolve()

https://github.com/bbejeck/Java-7/blob/master/src/main/java/bbejeck/nio/files/visitor/CopyDirVisitor.java

编辑: 大声笑现在,你说它我重新访问我的代码,并注意到我修补了lib的那一部分。人们很容易忘记这件事......

 @Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {

    Path relativizedPath =fromPath.relativize(dir);

    Path targetPath = toPath.resolve(relativizedPath.toString());
    if(!Files.exists(targetPath)){
        Files.createDirectory(targetPath);
    }
    return FileVisitResult.CONTINUE;
}

答案 1 :(得分:1)

我已经为此编写了一些实用方法。也许你觉得它们很有用(这个库是开源的)。

教程:http://softsmithy.sourceforge.net/lib/current/docs/tutorial/nio-file/index.html

Javadoc:http://softsmithy.sourceforge.net/lib/current/docs/api/softsmithy-lib-core/index.html

的Maven:

<dependency>  
    <groupId>org.softsmithy.lib</groupId>  
    <artifactId>softsmithy-lib-core</artifactId>  
    <version>0.2</version>   
</dependency> 

更多信息:http://puces-blog.blogspot.ch/2012/07/news-from-software-smithy-version-02.html