2

我想从获得的 URL 中复制目录(包括内容)

Some.class.getClassLoader().getResource("folder");

它返回jar:file:/D:/../some.jar!/someparentfile:/D:/../someparent

我想到了一个FileSystem(用于 jar intern dirs)并递归复制Files.walkFileTree(..).

是否可以修改jar:file:/D:/../some.jar!/folder为仅获得 FileSystem NIO2?

4

4 回答 4

2
    URL url = new URL("file:/C:/projektoj/ĝeneralaj");
    Path path = Paths.get(url.toURI());

C:\projektoj\ĝeneralaj

如果 URL 指向 jar/zip(“jar:file:/... .zip!.../...”),则可以使用 zip 文件系统中的路径,请参阅:java: change ZipEntry name

于 2014-02-05T14:34:30.517 回答
2

我正在寻找的是这样的:

JarURLConnection connection = (JarURLConnection) sourceUrl
     .openConnection();

Paths.get(connection.getJarFileURL().toURI());
于 2014-02-06T11:27:13.453 回答
0

实际上,NIO.2 实际上只是 Java 7 大修中添加的新 NIO 功能的方便标签。那是……除非您在该术语上赋予其他含义。

如果您想要一个不涉及任何非 NIO.2 的解决方案,那么(严格来说)这是不可能的。任何解决方案都将涉及使用String,并且String早于 NIO.2。因此它“不是 NIO.2”

或者,如果您将允许使用 NIO.2 中的类但不允许使用 NIO,那么FileNIO.2 或 NIO 都不是。它早于他们两个。


是否可以修改"jar:file:/D:/../some.jar!/folder"为仅获得 FileSystem NIO2?

如果您问是否有可能创建一个FileSystem可以处理该问题的提供程序,理论上答案是肯定的,而且它可能已经完成了......对您可以对 JAR 文件执行的操作的模数限制。(通过路径/文件系统进行就地更新将非常难以实现,并且在运行时资源方面很昂贵。)

如果您通过说只应使用 NIO.2 API 来实现提供程序和/或使用它来限制上述问题,那么答案可能是否定的。(但这取决于您所说的“仅 NIO.2 “ ...这取决于您真正想要实现的目标...)

于 2014-02-05T14:16:10.767 回答
0

看看:
http ://docs.oracle.com/javase/tutorial/essential/io/pathClass.html

版本说明:如果您有使用 java.io.File 的 JDK7 之前的代码,您仍然可以通过使用 File.toPath 方法来利用 Path 类功能。有关详细信息,请参阅旧文件 I/O 代码。

编辑:我猜File.toPath()方法应该是你想要的,它返回 a Path,在这种情况下Paths.get(URI)是没有必要的。

再次编辑:如果以 URL 开头,则可以利用Paths.get(URL.toURI()),但需要处理URISyntaxException从 URL.toURI() 抛出的问题。

正如@Stephen C 所提到的,Path是nio2 功能。

于 2014-02-05T14:23:37.803 回答