Доступ к библиотечному ресурсу в jar во время выполнения - PullRequest
1 голос
/ 10 апреля 2019

Я хочу сделать каталог и все его файлы доступными для метода.Каталог и файлы находятся в

src / main / resources / images

и внутри библиотеки jar во время выполнения.Я читаю каталог с

File directory = new File(getClass().getResource("/images").getFile());

Проверка содержимого directory с помощью

log.info("directory=" + directory.toString());
log.info("directory.isDirectory()=" + directory.isDirectory());
log.info("directory.isFile()=" + directory.isFile());
log.info("directory.canRead()=" + directory.canRead());

дает

  • directory = file: / home / leevilux/.m2/repository/groupid/library/1.0-SNAPSHOT/library-1.0-SNAPSHOT.jar!/images
  • directory.isDirectory () = false
  • directory.isFile () = false
  • directory.canRead () = false

Очевидно, что это не каталог, не файл, и я не могу прочитать.Но getFile что-то нашел, потому что если я использую getResource("/blabla") вместо этого (который не существует), то генерируется нулевой указатель (java.lang.NullPointerException).

Должен ли я извлечь банку всоздать "нормальные" пути?И если да, то как?

1 Ответ

1 голос
/ 11 апреля 2019

Да, вы должны извлечь ресурсы, которые вы хотите использовать. Другого пути нет. Это просто, когда вы знаете точный файл, который хотите использовать. Вы просто сохраняете его и после этого можете его использовать.

final InputStream directory = Main.class.getResourceAsStream("/images/name.jpg");
final byte[] buffer = new byte[directory.available()];
directory.read(buffer);
final File targetFile = new File("/tmp/target/name.jpg");
final OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);

Это не так просто, когда вы хотите настроить таргетинг на каталог. Вы должны просмотреть все записи вашего банка и сохранить все те, которые вы хотите использовать. Тогда, как и в случае выше, они могут быть использованы. Что-то вроде следующего примера.

public class UnzipJar {
    public static void main(String[] args) throws IOException {
        final URL dirURL = UnzipJar.class.getResource("/images");
        final String jarPath = dirURL.getPath().substring(5, dirURL.getPath().indexOf("!"));

        extract("images", "/tmp/dest", jarPath);
    }

    public static void extract(final String source, final String destination, String jarPath) throws IOException {
        final File file = new File(jarPath);
        final JarFile jar = new JarFile(file);
        for (final Enumeration<JarEntry> enums = jar.entries(); enums.hasMoreElements(); ) {
            final JarEntry entry = enums.nextElement();
            final String fileName = destination + File.separator + entry.getName();
            final File f = new File(fileName);
            if (fileName.startsWith(source) && !fileName.endsWith("/")) {
                final InputStream is = jar.getInputStream(entry);
                final FileOutputStream fos = new FileOutputStream(f);
                while (is.available() > 0) {
                    fos.write(is.read());
                }
                fos.close();
                is.close();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...