2016-11-11 125 views
0

我想显示含有从资源加载帮助CHM文件从资源加载的显示CHM文件:Java中,罐子

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

与JPG文件类似的问题已得到修复与BufferedImage类

BufferedImage img = null; 
URL url = this.getClass().getResource("/resources/test.jpg"); 
if (url!= null) 
{ 
    img = ImageIO.read(url); 
} 

无需任何转换到URI ...

感谢您的帮助......

+0

.jar文件是一个具有不同扩展名的zip文件。 .jar文件中的条目本身不是一个文件,并且尝试从.jar资源URL创建File对象将永远不会工作。使用[getResourceAsStream](http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getResourceAsStream-java.lang.String-)和[复制流](http:/ /docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#copy-java.io.InputStream-java.nio.file.Path-java.nio.file.CopyOption .. .-)到一个临时文件。 – VGR

+0

@ VGR:感谢您的评论。不幸的是,它可能无法完成。该程序将作为Java Web Start应用程序运行,需要一些额外的权利(或不是?)... – justik

+0

如果您有权执行Desktop.open,我认为您将有权[创建一个临时文件]( http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempFile-java.lang.String-java.lang.String-java.nio.file.attribute。 FileAttribute ...-)。 – VGR

回答

1

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

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传递给一个非可编辑的JEditorPane。如果你想有一个目录,一个索引和搜索,你可能要考虑学习如何使用JavaHelp

+0

@ VGR,非常感谢,它的工作原理......但是,如何处理chm文件是一种常见的方式?那么比临时文件更直接的方法呢? :-) – justik

+0

.jar文件是一个zip文件。它的条目不是单独的文件,句点。没有更直接的方法。 – VGR

+0

@ VGR:再次感谢您的解释和耐心...... – justik