Java,在jar中显示从资源加载的chm文件

Java,在jar中显示从资源加载的chm文件,java,resources,chm,Java,Resources,Chm,我正在尝试显示包含从以下资源加载的帮助的chm文件: try { URL url = this.getClass().getResource("/resources/help.chm"); File file = new File(url.toURI()); Desktop.getDesktop().open(file); //Exception } catch (Exception e) { e.printStackTrace();

我正在尝试显示包含从以下资源加载的帮助的chm文件:

try  
{
    URL url = this.getClass().getResource("/resources/help.chm");

    File file = new File(url.toURI());
    Desktop.getDesktop().open(file);       //Exception 
} 

catch (Exception e) 
{
     e.printStackTrace();
}
从NetBeans运行项目时,将正确显示帮助文件。 不幸的是,当程序从jar文件运行时,它不起作用;这导致了一个例外

在我看来,URI描述的jar的内部结构还没有被认识到。。。还有更好的办法吗?例如,使用BufferReader类

BufferedReader in = new BufferedReader( new InputStreamReader(url.openStream()));
BuffereImage类修复了jpg文件的类似问题

BufferedImage img = null;
URL url = this.getClass().getResource("/resources/test.jpg");
if (url!= null)
{
     img = ImageIO.read(url);
}
没有任何转换到URI


感谢您的帮助。

A.jar文件是一个具有不同扩展名的zip文件。.jar文件中的条目本身不是文件,尝试从.jar资源URL创建文件对象将永远无法工作。使用流并将其复制到临时文件:

Path chmPath = Files.createTempFile(null, ".chm");

try (InputStream chmResource =
    getClass().getResourceAsStream("/resources/help.chm")) {

    Files.copy(chmResource, chmPath,
        StandardCopyOption.REPLACE_EXISTING);
}

Desktop.getDesktop().open(chmPath.toFile());

或者,根据帮助内容的简单程度,您可以将其存储为单个HTML文件,并将资源URL传递给不可编辑的窗格。如果你想要一个目录,一个索引,和搜索,你可能想考虑如何使用。

A.jar文件是一个具有不同扩展名的zip文件。.jar文件中的条目本身不是文件,尝试从.jar资源URL创建文件对象将永远无法工作。使用和创建一个临时文件。@VGR:谢谢您的评论。不幸的是,这可能无法做到。该程序将作为Java Web Start应用程序运行,需要(或不需要?)一些额外的权限…如果您有权执行Desktop.open,我想您将有权执行。@VGR:我可以问您一个例子吗?@VGR,非常感谢,它很有效。。。但是,如何处理chm文件是一种常见的方法吗?还有比临时文件更“直接”的方法吗?:-)jar文件是一个zip归档文件。它的条目不是单独的文件,句号。没有比这更直接的方法了。