2016-11-11 2 views
0

Я пытаюсь отобразить файл CHM, содержащий справку, которая загружается из ресурсов:Java, дисплей 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, не была распознана ... Есть ли лучший способ? Например, используя класс 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 сама по себе не является файлом, и попытка создать объект File из URL-адреса ресурса .jar будет * никогда * работать. Используйте [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 сама по себе не является файлом, и попытка создать объект File из URL-адреса ресурса .jar никогда не будет работать. Используйте 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

Смежные вопросы