Загрузите все файлы из каталога, используя .getClassLoader (). GetResource () - PullRequest
3 голосов
/ 10 декабря 2011

В одном из моих тестов JUnit я пытаюсь загрузить все файлы, содержащиеся в каталоге.Я использовал .getClassLoader().getResource("otherresources"), чтобы найти каталог.Затем я сделал новый java.io.File.Затем я использовал listFiles(), чтобы получить все дочерние файлы, а затем снова использовал .getClassLoader().getResource(), чтобы загрузить каждый из этих файлов.

URL url = FileLoadTest.class.getClassLoader().getResource("otherresources");
File directory = new File(url.getPath());
File[] files = directory.listFiles();

По сути, я хочу иметь возможность загружать все файлы в каталог, не зная точно, что они есть.

Я могу правильно запустить тест в Eclipse.Когда я собираюсь построить проект с Maven (mvn install) или запустить тестовый пример сам по себе, используя surefire (mvn -Dtest=FileTest test), тестовый пример завершается с NullPointerException.Я думаю, что проблема как-то связана с тем, что api-файл не работает должным образом в файле JAR, в котором развернуты ресурсы.

Любые советы, как это исправить?

Ответы [ 2 ]

5 голосов
/ 10 декабря 2011

Правильно, File API может читать только из файловой системы, а не из файлов JAR.

К сожалению, нет хорошего способа сделать именно то, что вы пытаетесь сделать, без использования некоторых дополнительных библиотек, которые используют некоторые хаки в попытке сделать это. Ресурсы в classpath не предназначены для перечисления, так как нет гарантии, откуда они загружены (могут быть с диска, в файле JAR, HTTP, базе данных или других экзотических ресурсах - включая те, где перечисление доступных файлов). не будет осуществимо). Наилучший подход - включить «индекс» или другой подобный файл с хорошо известным именем, на который можно ссылаться, чтобы найти другие интересующие вас ресурсы.

Одним из этих "хаков" будет, если вы знаете путь к файлам JAR, вы можете прочитать их, используя JarFile (или даже просто ZipFile).

3 голосов
/ 10 декабря 2011
.getClassLoader().getResource("otherresources")

Не проверено. Когда у вас есть «каталог», используйте его, чтобы вернуться к самому архиву.

  • Установить ZipInputStream в архив.
  • Позвоните getNextEntry() до null и добавьте записи, соответствующие требуемому местоположению, в расширяемый список (например, ArrayList).
  • Создайте URL из местоположения архива и ZipEntry.getName()

Конечно, я бы обычно предлагал создать список целевых ресурсов при создании архива, а затем включить этот список в известном месте в архиве. Но вышеупомянутого может быть достаточно для этого варианта использования.

...