Ссылочный файл Java Desktop.open (Файл f) в JAR? - PullRequest
7 голосов
/ 12 октября 2009

Возможно ли для 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.

Ответы [ 4 ]

6 голосов
/ 12 октября 2009

«Файлы» внутри файлов .jar не являются файлами для операционной системы. Они представляют собой просто область файла .jar и обычно сжимаются. Они не могут быть адресованы ОС как отдельные файлы и поэтому не могут отображаться таким образом.

Сама Java имеет удобный способ обращения к этим файлам по некоторому URI (как вы поняли, используя getResource()), но это полностью зависит от Java.

Если вы хотите, чтобы какое-то внешнее приложение получило доступ к этому файлу, у вас есть два возможных решения:

  1. Укажите какой-нибудь стандартизированный способ доступа к файлу или
  2. Сделать приложение способным обращаться к файлам, упакованным в файл .jar (или .zip).

Обычно 2 на самом деле не вариант (если другое приложение также не написано на Java, в этом случае это довольно просто).

Вариант 1 обычно выполняется путем простой записи во временный файл и ссылки на него. В качестве альтернативы вы можете запустить небольшой веб-сервер и предоставить файл по некоторому URL.

3 голосов
/ 12 октября 2009

Ресурс в файле JAR просто не файл - поэтому вы не можете использовать File, чтобы добраться до него. Если вы используете что-то, что действительно нуждается в файле, вам действительно придется создать временный файл и открыть его вместо этого.

1 голос
/ 12 октября 2009

Но запись в файле JAR - , а не File! JAR-файл - это файл; его записи являются записями JAR-файла (чтобы заявить очевидное).

Java содержит абстракции, которые означают, что вам не обязательно работать с File s - почему бы не использовать Reader или InputStream для инкапсуляции ввода?

0 голосов
/ 12 октября 2009

Нет, это не так, потому что, как вы только что видели, у вас нет действительного файла на первом месте

Из статьи: Используя Desktop API в Java SE 6 , мы получили

OPEN: Представляет открытое действие, выполняемое приложением, связанное с открытием определенного типа файла

Таким образом, у вас должен быть действительный файл, а затем приложение, связанное с этим файлом, чтобы ОС могла его открыть. Хотя такое приложение может существовать, вам все равно нужно, чтобы оно понимало URL-адрес вашего файла.

...