【问题标题】:What does the error "java.lang.IllegalArgumentException: URI i s not hierarchical" mean?错误“java.lang.IllegalArgumentException: URI i s not hierarchy”是什么意思?
【发布时间】:2015-05-13 17:18:25
【问题描述】:

我有一个 java 应用程序,它使用 xml 文件解码图像上的信息。 xml 文件位于最顶层的包中。这是我用来获取文件的代码

java.net.URL url = DecodeButton.class.getResource("/text.xml");
File process_file = new File(url.toURI());

代码在eclipse中运行正常。当我创建 jar 并按下解码按钮执行解码时,这是错误:

jar:file:/C:/simple3.jar!/text.xml 线程异常 “AWT-EventQueue-0” java.lang.IllegalArgumentException:URI 不是 分层的 在 java.io.File.(未知来源) 在 com.simplediptool.DecodeButton1.actionPerformed(DecodeButton1.java:70)

   Line 70: File process_file = new File(url.toURI());

我哪里出错了?

【问题讨论】:

  • 您似乎在 Windows 上运行它。尝试将 unix 文件分隔符“/”替换为 Windows 文件分隔符“\”。
  • 它在 Eclipse 中运行良好,因为在 Eclipse 中,您的类和资源驻留在本机文件系统中。打包到 jar 中时,资源不是普通文件,因此您不能将它们的 URL(在异常消息中看到的 jar: URL)转换为 File 对象——它们不是文件。
  • 但在这种情况下,它甚至不会在 Eclipse @DavisBroda 中编译
  • @Holger:那怎么解决呢?
  • 没有办法为不是文件的东西创建File 对象。但这是一个“XY 问题”;问题是为什么你认为你需要File,换句话说,你的实际问题是什么。

标签: java jar uri


【解决方案1】:

而不是使用

DecodeButton.class.getResource(......);

使用

DecodeButton.class.getResourceAsStream(........);

JAR 文件是一个包含许多资源的统一文件,就像 ZIP 或 WAR 文件一样。要访问单个资源,您需要将其视为流,因此使用上述内容。另一方面,在 eclipse 中,文件可以作为资源直接访问,因此它可以工作。

这将解决您的问题。

【讨论】:

  • 使用getResourceAsStream(…),它只是getResource(…).openStream() 的简写,将解决问题如果需要InputStream。目前我们根本不知道 OP 想要对文件做什么。例如。如果应该将资源传递给 XML 解析器,最好将 URL 直接传递给解析器,因为这会告诉解析器如何解析相关链接,并有助于在出现问题时提供更好的错误消息。
  • Holger,你的问题似乎弄错了。这里的问题是代码在 Eclipse 中编译并成功运行,但是在创建 JAR 之后会抛出上述异常。这清楚地表明该资源不可访问,并且基本拇指规则在任何 JAR 文件中,如果您想访问资源,请将其视为流。它肯定会工作。
  • 我很清楚问题是什么。是要求“基本拇指规则”。流可以解决问题,但不是在所有情况下。这完全取决于操作。例如。您不能以这种方式写入资源,也不能以这种方式列出资源的兄弟姐妹。
  • @Iqbal:谢谢。但我需要创建一个文件对象。使用 getResourceAs 流,我得到了一个 inputstream 对象。
  • @javanewbie,只需使用以下链接中给出的任何方法将输入流转换为文件对象即可:baeldung.com/convert-input-stream-to-a-file
猜你喜欢
  • 2021-05-27
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2019-08-24
  • 1970-01-01
相关资源
最近更新 更多