JAR中的Java Desktop.open(File f)引用文件?

Desktop.open(File f)可以引用位于JAR中的文件吗?

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

 URL url = ClassLoader.getSystemClassLoader().getResource(...); System.out.println("url=" + url); // url is valid Desktop.getDesktop().open(new File(url.toURI())); 

可能性是JavaRanch的答案 ,即从JAR中的资源创建一个临时文件 – 不是很优雅。

这是在Windows XP上运行的。

.jar文件中的“文件”不是操作系统的文件。 它们只是.jar文件的某个区域,通常是压缩的。 它们不能被OS作为单独的文件寻址,因此不能以这种方式显示。

Java本身有一种巧妙的方式来通过某些URI引用这些文件(正如您通过使用getResource()实现的那样),但这完全是Java特定的。

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

  1. 提供一些标准化的方式来访问文件或
  2. 使应用程序能够处理打包在.jar(或.zip)文件中的文件。

通常2不是一个真正的选项(除非另一个应用程序也是用Java编写的,在这种情况下它很容易)。

选项1通常只需写入临时文件并参考即可。 或者,您可以启动一个小型Web服务器并通过某个URL提供该文件。

jar文件中的资源根本不是文件 – 因此您无法使用File来访问它。 如果你正在使用真正需要文件的东西,你确实必须创建一个临时文件并打开它。

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

Java包含的抽象意味着您不一定需要使用File – 为什么不使用ReaderInputStream来封装输入?

不,它不是,因为你只是见证你没有一个有效的文件

从文章:我们得到的Java SE 6中使用Desktop API

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

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