Подтвердить что ты не робот

Получить файл из JAR

Я использую Spring Resource абстракцию для работы с ресурсами (файлами) в файловой системе. Одним из ресурсов является файл внутри JAR файла. Согласно следующему коду, представляется, что ссылка действительна

ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();

// The path to the resource from the root of the JAR file
Resource fileInJar = resourcePatternResolver.getResources("/META-INF/foo/file.txt");

templateResource.exists(); // returns true
templateResource.isReadable();  // returns true

В этот момент все хорошо, но затем, когда я пытаюсь преобразовать Resource в File

templateResource.getFile();

Я получаю исключение

java.io.FileNotFoundException: class path resource [META-INF/foo/file.txt] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/m2repo/uic-3.2.6-0.jar!/META-INF/foo/file.txt        
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:198)
at org.springframework.core.io.ClassPathResource.getFile(ClassPathResource.java:174)

Каков правильный способ получить ссылку File для Resource, которая существует внутри JAR файла?

4b9b3361

Ответ 1

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

Правильный способ не делает этого вообще, потому что это невозможно. A File представляет собой фактический файл в файловой системе, который не имеет записи JAR, если у вас нет специальной файловой системы для этого.

Если вам просто нужны данные, используйте getInputStream(). Если вам нужно удовлетворить API, который требует объект File, то я боюсь, что единственное, что вы можете сделать, это создать временный файл и скопировать данные из входного потока на него.

Ответ 2

Если вы хотите прочитать его, просто позвоните resource.getInputStream()

Сообщение об исключении довольно ясно - файл не находится в файловой системе, поэтому вы не можете иметь экземпляр File. Кроме того, что будет делать с этим File, кроме чтения его содержимого?

Ответ 3

Быстрый просмотр ссылки которую вы предоставили для документации по ресурсам, говорит следующее:

Throws: IOException if the resource cannot be resolved as absolute file path, 
i.e. if the resource is not available in a file system

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

Ответ 4

Просто добавьте пример к ответам здесь. Если вам требуется File (а не только его содержимое) из вашего JAR, сначала необходимо создать временный файл из ресурса. (Ниже указано Groovy):

    InputStream inputStream = resourceLoader.getResource('/META-INF/foo/file.txt').inputStream
    File tempFile = new File('file.txt')
    OutputStream outputStream = new FileOutputStream(tempFile)

    try {
        IOUtils.copy(inputStream, outputStream)
    } catch (IOException e) {
        // Handle exception
    } finally {
        outputStream.close()
    }