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

时间:2009-10-12 18:39:00

标签: java jar desktop

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()));

可能性是the answer at JavaRanch,这是从JAR中的资源创建一个临时文件 - 不是很优雅。

这是在Windows XP上运行。

4 个答案:

答案 0 :(得分:6)

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

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

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

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

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

答案 1 :(得分:3)

jar文件中的资源只是不是文件 - 所以你不能使用File来获取它。如果您正在使用真正需要文件的内容,您确实必须创建一个临时文件并将其打开。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

不,事实并非如此,因为您只是见证了首先没有有效的文件

来自文章:Using the Desktop API in Java SE 6我们得到了

  

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

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