【问题标题】:Java Desktop.open(File f) reference file within JAR?JAR 中的 Java Desktop.open(File f) 参考文件?
【发布时间】:2009-10-12 18:38:59
【问题描述】:

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 上运行的。

【问题讨论】:

  • 实际上创建一个临时文件是一个很好的解决方法。您可以为此创建一个“优雅”的库,因此您不必每次都编写代码。

标签: java jar desktop


【解决方案1】:

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

Java 本身有一种通过某个 URI 引用这些文件的简洁方法(正如您通过使用 getResource() 意识到的那样),但这完全是 Java 特定的。

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

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

通常 2 并不是一个真正的选择(除非其他应用程序也是用 Java 编写的,在这种情况下它相当容易)。

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

【讨论】:

  • 我确实在应用程序中嵌入了一个 Web 服务器 (Jetty)。那么问题是 Desktop.browse(URI) 只会启动浏览器而不是应用程序。
  • @Kuo:是的,我意识到你在我添加编辑后询问了 open() 。当然对于 open() 只有临时文件解决方案才有用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2011-03-07
        • 2016-09-18
        • 2013-02-24
        • 2013-06-30
        • 1970-01-01
        相关资源
        最近更新 更多