JAR中的javadesktop.open(filef)参考文件?

JAR中的javadesktop.open(filef)参考文件?,java,jar,desktop,Java,Jar,Desktop,是否可以为Desktop.open(File f)引用位于JAR中的文件 我尝试使用ClassLoader.getResource(String s),将其转换为URI,然后从中创建一个文件。但这会导致IllegalArgumentException:URI不是分层的 URL url = ClassLoader.getSystemClassLoader().getResource(...); System.out.println("url=" + url); // url is valid

是否可以为
Desktop.open(File f)
引用位于JAR中的文件

我尝试使用
ClassLoader.getResource(String s)
,将其转换为URI,然后从中创建一个文件。但这会导致IllegalArgumentException:URI不是分层的

URL url = ClassLoader.getSystemClassLoader().getResource(...);
System.out.println("url=" + url);    // url is valid
Desktop.getDesktop().open(new File(url.toURI()));
一种可能性是,从JAR中的资源创建一个临时文件——这不是很优雅


这是在Windows XP上运行的。

jar文件中的资源根本不是文件-因此您不能使用
文件来访问它。如果您使用的是真正需要文件的东西,那么您确实需要创建一个临时文件并打开它。

但是JAR文件中的条目不是
文件
!JAR文件是一个文件;它的条目是JAR文件条目(这是显而易见的)

Java包含抽象,这意味着您不一定需要使用
文件
s-为什么不使用
读取器
输入流
来封装输入?

.jar文件中的“文件”不是操作系统的文件。它们只是.jar文件的一部分,通常是压缩的。操作系统无法将它们作为单独的文件寻址,因此无法以这种方式显示

Java本身有一种通过某种URI引用这些文件的简洁方法(正如您通过使用
getResource()
实现的),但这完全是Java特有的

如果您希望外部应用程序访问该文件,您有两种可能的解决方案:

  • 提供一些标准化的方式来访问文件或
  • 使应用程序能够寻址打包在.jar(或.zip)文件中的文件
  • 通常2不是一个真正的选项(除非另一个应用程序也是用Java编写的,在这种情况下它相当容易)


    选项1通常通过简单地写入一个临时文件并引用该文件来完成。或者,您可以启动一个小型web服务器,并通过某个URL提供文件。

    不,它不是,因为正如您刚才看到的,您首先没有有效的文件

    来自文章:我们得到了

    打开:表示与打开特定文件类型相关联的应用程序执行的打开操作


    因此,您必须有一个有效的文件,然后有一个与该文件关联的应用程序,以便操作系统可以打开它。虽然这样的应用程序可能存在,但您仍然必须让它了解文件的URL。

    实际上,创建临时文件是一个很好的解决方法。您可以为此创建一个“优雅”的库,这样您就不必每次都对它进行编码。实际上,我在应用程序中嵌入了一个web服务器(Jetty)。那个么问题是桌面。浏览(URI)只会启动浏览器,而不会启动应用程序。@Kuo:是的,在我添加编辑后,我意识到你们询问了open()。当然,对于open(),只有临时文件解决方案是有用的。