Сканировать папку внутри JAR

Было задано много подобных вопросов, но я не могу вытерпеть столько боли, прежде чем мне придется задать вопрос самому.

В любом случае, у меня есть файлы в jar file/input, и мне нужно прочитать список имен файлов в этой папке (а позже прочитать сами файлы).

Попытка №1:

String path Main.class.getProtectionDomain().getCodeSource().getLocation().getPath();
// "/Applications/company/extensions/components/Box/Box/Box.jar"
String decoded = URLDecoder.decode(path, "UTF-8");
// "/Applications/company/extensions/components/Box/Box/Box.jar"
File[] files = (new File(decoded + "/input")).listFiles();
// files = null (bad)

Попытка №2:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL url = classLoader.getResource("input");
// url.file: "file:/Applications/company/extensions/components/Box/Box/Box.jar!/input"
// url.path: (ditto)
// url.protocol: "jar"
// url.host: ""
// url.query: null
// url.port: -1
java.net.URI uri = new java.net.URI(url.getProtocol(), url.getAuthority(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
// URISyntaxException --> "Relative path in absolute URI" (bad)

Другие разные попытки между ними имели тот же результат. Я просто не могу прочитать папку в этой банке...

Кто-нибудь знает, как это исправить?


person Ryan    schedule 27.02.2012    source источник
comment
stackoverflow.com/questions/1429172/   -  person Oleg Mikheev    schedule 27.02.2012
comment
сколько мучений я могу вынести, прежде чем мне придется задать вопрос самому. Сколько мучений вам потребуется, чтобы обрисовать исключительную потребность в этой функциональности? Удовлетворите чрезвычайную потребность, и, вероятно, будут предложены лучшие стратегии для ее достижения. (И я подозреваю, что все эти другие темы не смогли получить хороших ответов, потому что ОП был слишком сосредоточен на том, что они пытались сделать, а не на том, что они пытались < b>достичь.) Кстати, кто строит банку?   -  person Andrew Thompson    schedule 27.02.2012
comment
Программа не может перекомпилироваться после развертывания, поэтому она должна динамически изменяться в зависимости от событий, запускающих чтение файлов в этой папке. И боль = 2 часа, пока. Я пробую то, что было опубликовано, но пока ничего не смог заставить работать. И я строю банку **   -  person Ryan    schedule 27.02.2012
comment
Я только что прочитал, что вы не можете изменить банку во время выполнения, что делает мою проблему спорной. Я думаю, что просто буду хранить файлы удаленно и читать их с помощью HTTP-вызова. Если у кого-то нет идеи получше...? stackoverflow.com/ вопросы/6805616/   -  person Ryan    schedule 27.02.2012


Ответы (2)


Возможно, я неправильно понял ваш вопрос, но... предполагается использовать пакет java.util.jar?

Вот пример: Отображение содержимого файла jar

Надеюсь это поможет

person Mark Bramnik    schedule 27.02.2012

В соответствии с Как мне перечислить файлы внутри файла JAR ?

CodeSource src = MyClass.class.getProtectionDomain().getCodeSource();
if (src != null) {
  URL jar = src.getLocation();
  ZipInputStream zip = new ZipInputStream(jar.openStream());
  /* Now examine the ZIP file entries to find those you care about. */
  ...
} 
person Oleg Mikheev    schedule 27.02.2012