错误“java.lang.IllegalArgumentException:URI i不是分层的”是什么意思?

错误“java.lang.IllegalArgumentException:URI i不是分层的”是什么意思?,java,jar,uri,Java,Jar,Uri,我有一个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

我有一个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.Unknown Source 在com.simpleditool.DecodeButton1.actionPerformedDecodeButton1.java:70

我哪里出错了?

而不是使用

DecodeButton.class.getResource(......);
使用

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


这将解决您的问题。

您似乎正在windows上运行此功能。尝试将unix文件分隔符/替换为Windows文件分隔符\。它在Eclipse中工作正常,因为在Eclipse中,类和资源驻留在本机文件系统中。当打包到jar中时,资源不是普通的文件,因此您无法将它们的URL转换为文件对象,如异常消息中所示,它们不是文件,它甚至不会在eclipse中编译@DavisBroda@Holger:那么如何解决?无法为非文件的对象创建文件对象。但这是一个“XY问题”;问题是为什么你认为你需要一个文件,换句话说,你的实际问题是什么。如果需要一个InputStream,使用getResourceAsStream…,这只是getResource…,openStream的简写,将解决这个问题。目前我们根本不知道OP想要对文件做什么。例如,如果应该将资源传递给XML解析器,则最好将URL直接传递给解析器,因为这样可以告诉解析器如何解析相对链接,并有助于在出现错误时提供更好的错误消息。Holger,你似乎答错了问题。这里的问题是代码在eclipse中编译并成功运行,但在创建JAR后会抛出上述异常。这清楚地表明资源是不可访问的,基本的拇指规则在任何JAR文件中。如果您想访问资源,请将其视为流。它肯定会起作用的。我完全知道问题是什么。这并不是要求一个“基本的经验法则”。流可以解决问题,但并非在所有情况下都可以。这完全取决于操作。例如,您不能以这种方式写入资源,也不能以这种方式列出资源的同级。@Iqbal:谢谢。但是我需要创建一个文件对象。使用getResourceAs流,我得到一个inputstream对象。@javanewbie,只需使用下面链接中给出的任何方法将输入流转换为文件对象,即可完成:
DecodeButton.class.getResource(......);
DecodeButton.class.getResourceAsStream(........);