получить файл из JAR - PullRequest
       8

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

12 голосов
/ 10 августа 2010

Я использую абстракцию Spring * * Spring * для работы с ресурсами (файлами) в файловой системе. Одним из ресурсов является файл внутри файла 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?

Ответы [ 4 ]

18 голосов
/ 10 августа 2010

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

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

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

4 голосов
/ 10 августа 2010

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

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

0 голосов
/ 23 декабря 2015

Просто добавьте пример к ответам здесь.Если вам нужен 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()
    }
0 голосов
/ 10 августа 2010

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

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(), чтобы прочитать его содержимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...