Получение ресурсов из jar: classloader vs class resourceasstream - PullRequest
2 голосов
/ 26 сентября 2011

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

Например:

import mypath.myclass; //from a jar
String result = gitid.getGitId(myclass.class);

На резервной копии, которую я сейчас использую:

InputStream is = null;
BufferedReader br = null;
String line;
is = c.getResourceAsStream("/com/file.text");

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

Я также пробовал:

is = c.getClassLoader().getResourceAsStream("/com/file.text");

Это терпит неудачу полностью.

Любые предложения будут высоко оценены.

Кроме того, в чем отличие вызова getResourceAsStream из загрузчика классов против класса?

Ответы [ 2 ]

3 голосов
/ 26 сентября 2011

Class.getResourceAsStream() получает экземпляр ClassLoader, почти так же, как вы получаете от Class.getClassLoader() call.

Что вы можете сделать, это получить URL-адрес для данного класса и заменить путь ресурса класса своим путем к вашему файлу. например, следующий код вернет ресурс из того же jar-файла:

  Class c = String.class;
  URL u = c.getResource('/' + c.getName().replace('.', '/') + ".class");
  String s = u.toString();
  URL url = new URL(s.substring(0, s.indexOf('!')) + "!/META-INF/MANIFEST.MF");
  InputStream is = url.openStream();

Вам придется обрабатывать папки классов, не являющиеся коробками, отдельно.

0 голосов
/ 26 сентября 2011

Вероятно, все классы были загружены одним и тем же экземпляром ClassLoader. Так что, пока путь ресурса не меняется, вы будете получать один и тот же ресурс каждый раз.

getResourceAsStream

Этот метод делегирует загрузчику классов этого объекта. Если этот объект был загружен загрузчиком класса начальной загрузки, метод делегируется ClassLoader.getSystemResourceAsStream (java.lang.String).

...