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(),只有临时文件解决方案是有用的。