gpt4 book ai didi

java - 将 Jar-URI 转换为 nio.Path

转载 作者:行者123 更新时间:2023-11-30 03:14:58 25 4
gpt4 key购买 nike

在一般情况下,我在从 URI 转换为 nio.Path 时遇到问题。给定一个具有多个架构的 URI,我希望创建一个 nio.Path 实例来反射(reflect)此 URI。

    //setup
String jarEmbeddedFilePathString = "jar:file:/C:/Program%20Files%20(x86)/OurSoftware/OurJar_x86_1.0.68.220.jar!/com/our_company/javaFXViewCode.fxml";
URI uri = URI.create(jarEmbeddedFilePathString);

//act
Path nioPath = Paths.get(uri);

//assert --any of these are acceptable
assertThat(nioPath).isEqualTo("C:/Program Files (x86)/OurSoftware/OurJar_x86_1.0.68.220.jar/com/our_company/javaFXViewCode.fxml");
//--or assertThat(nioPath).isEqualTo("/com/our_company/javaFXViewCode.fxml");
//--or assertThat(nioPath).isEqualTo("OurJar_x86_1.0.68.220.jar!/com/our_company/javaFXViewCode.fxml")
//or pretty well any other interpretation of jar'd-uri-to-path any reasonable person would have.

此代码当前在 Paths.get() 调用上抛出 FileSystemNotFoundException

此转换的实际原因是询问生成的路径有关其包位置和文件名的信息 - 换句话说,只要生成的路径对象保留 ...com/our_company/javaFXViewCode.fxml部分,那么我们使用NIO Path对象还是很方便的。

大部分信息实际上用于调试,因此我不可能改造我们的代码以避免在此特定实例中使用路径,而是使用 URI 或简单的字符串,但这将涉及大量的重组用于 nio.Path 对象已经方便地提供的方法。

我已经开始深入研究the file system provider API对于这么一件小事,我所面临的复杂性超出了我的意愿。在 URI 指向非 jar 文件且不是操作系统可理解但仍然有用的情况下,是否有一种简单的方法可以将类加载器提供的 URI 转换为与操作系统可理解的遍历相对应的路径对象在路径指向 jar 内的资源(或者 zip 或 tarball)的情况下进行遍历?

感谢您的帮助

最佳答案

Java Path属于FileSystem 。文件系统由 FileSystemProvider 实现.

Java 附带两种文件系统提供程序:一种用于操作系统(例如 WindowsFileSystemProvider),另一种用于 zip 文件(ZipFileSystemProvider)。这些是内部的,不应直接访问。

要获取 Jar 文件内文件的路径,您需要获取(创建)Jar 文件内容的FileSystem。然后,您可以获得该文件系统中文件的路径

首先,您需要解析 Jar URL,最好使用 JarURLConnection 来完成:

URL jarEntryURL = new URL("jar:file:/C:/Program%20Files%20(x86)/OurSoftware/OurJar_x86_1.0.68.220.jar!/com/our_company/javaFXViewCode.fxml");
JarURLConnection jarEntryConn = (JarURLConnection) jarEntryURL.openConnection();
URL jarFileURL = jarEntryConn.getJarFileURL(); // file:/C:/Program%20Files%20(x86)/OurSoftware/OurJar_x86_1.0.68.220.jar
String entryName = jarEntryConn.getEntryName(); // com/our_company/javaFXViewCode.fxml

一旦有了这些,您就可以创建一个文件系统并获取jar文件的路径。请记住,FileSystem 是开放资源,使用完毕后需要将其关闭:

try (FileSystem jarFileSystem = FileSystems.newFileSystem(jarPath, null)) {
Path entryPath = jarFileSystem.getPath(entryName);
System.out.println("entryPath: " + entryPath); // com/our_company/javaFXViewCode.fxml
System.out.println("parent: " + entryPath.getParent()); // com/our_company
}

关于java - 将 Jar-URI 转换为 nio.Path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32873899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com