Открыть файл; попробуйте сначала файловую систему, затем JAR - PullRequest
2 голосов
/ 29 сентября 2010

Я пытаюсь, чтобы мое приложение прозрачно загрузило ресурс (двоичный файл):

Если файл существует в текущем каталоге, откройте его.
Если нет, попробуйте поискать текущий файл JAR, если применимо.
Если нет, попробуйте поискать другие файлы JAR. (Это необязательно, и я не против явно указать, какие файлы JAR.)

До сих пор я знал о File, который открывает локальный файл, и ClassLoader, который имеет getResource* для содержимого JAR.

Есть ли класс, который объединяет два? Если нет, то как мне написать самому? Должен ли я написать ClassLoader, который также проверяет локальную файловую систему? Используете File? (Я очень незнаком с Java и даже не знаю, какой хороший тип для возврата. InputStream?)

Спасибо

P.S. Под «файлом» я подразумеваю «путь», например, "Данные / texture1.png".

Ответы [ 3 ]

6 голосов
/ 29 сентября 2010

Делать № 1 и № 3 довольно легко.Выполнение # 2 (только просмотр текущего JAR-файла) намного сложнее, так как требует, чтобы вы выяснили, какой JAR вы

Если вы хотите сначала проверить файловую систему, в противном случае загрузить из classpath, это будет что-то вроде:

public java.io.InputStream loadByName(String name) {
  java.io.File f = new java.io.File(name);
  if (f.isFile()) {
    return new FileInputStream(f);
  } else {
    return getClass().getResource(name);
  }
}

Если вы хотите сначала загрузить из того же JAR-файла, вам необходимо выяснить, где он находится.Проверьте Определите, к какому JAR-файлу относится класс , чтобы получить дополнительную информацию о том, как определить JAR-файл, из которого вы хотите загрузить ресурс.

3 голосов
/ 29 сентября 2010

A URLClassLoader должен иметь возможность загрузить оба файла и сначала попробовать путь к файлу, если путь к файлу находится на пути к классам перед jar.


По поводу ваших комментариев:

1 голос
/ 29 сентября 2010

Текущий файл JAR и текущий каталог не являются понятиями в JVM, как это происходит при запуске сценария оболочки. Вам нужно будет указать каталог, который будет использоваться для загрузки интересующих вас файлов, например, с системным свойством при выполнении JVM:

java -Ddirectory.to.scan=/home/aib

Затем получить это свойство:

String dir = System.getProperty("directory.to.scan");

Теперь, когда речь идет о файлах JAR, все файлы JAR, указанные явно в пути к классам при запуске JVM, загружаются ClassLoader. Вы можете получить ClassLoader определенного класса:

InputStream is = <Your class>.class.getClassLoader().getResourceAsStream("binary file");

Обратите внимание, что поиск выполняется в любом файле jar, загруженном текущим загрузчиком классов.

...