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特定的。
如果您希望某个外部应用程序访问该文件,您有两种可能的解决方案:
- 提供一些标准化的方式来访问文件或
- 使应用程序能够处理打包在.jar(或.zip)文件中的文件。
通常2不是一个真正的选项(除非另一个应用程序也是用Java编写的,在这种情况下它很容易)。
选项1通常只需写入临时文件并参考即可。 或者,您可以启动一个小型Web服务器并通过某个URL提供该文件。
jar文件中的资源根本不是文件 – 因此您无法使用File
来访问它。 如果你正在使用真正需要文件的东西,你确实必须创建一个临时文件并打开它。
但是JAR文件中的条目不是File
! JAR文件是一个文件; 它的条目是JAR文件条目(显而易见)。
Java包含的抽象意味着您不一定需要使用File
– 为什么不使用Reader
或InputStream
来封装输入?
不,它不是,因为你只是见证你没有一个有效的文件
从文章:我们得到的Java SE 6中使用Desktop API
OPEN:表示与打开特定文件类型相关联的应用程序执行的打开操作
因此,您必须拥有一个有效的文件,然后将该应用程序与该文件关联,以便操作系统可以打开它。 虽然这样的应用程序可能存在,但您仍然必须让它理解您的文件的URL。