2010-08-10 12 views
12

저는 파일 시스템의 리소스 (파일)로 작업하기 위해 Spring의 Resource 추상화를 사용하고 있습니다. 자원 중 하나는 JAR 파일 안에있는 파일입니다. 다음 코드에 따르면, 모든 잘하지만, 그때는 FileJAR에서 파일 가져 오기

templateResource.getFile(); 

Resource를 변환하려고 할 때 예외를 얻을, 참조가이 시점에서

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 

유효 나타납니다 JAR 파일 내부에 존재하는 ResourceFile 참조를 얻을 수있는 올바른 방법은

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) 

무엇입니까? 당신이 그것을 읽고 싶다면

답변

4

, 단지 전화 resource.getInputStream()

예외 메시지는 매우 분명하다 - 당신은 File 인스턴스를 가질 수 있도록 파일은 파일 시스템에 상주하지 않습니다. 게다가 그 내용을 읽는 것 외에는 File으로 무엇을 할 것인가? JAR 파일 내부 을 존재하는 자원에 대한 파일 참조를 얻을 수있는 올바른 방법은

+0

가 나에게 InputStream를 줄 것이다,하지만 내가 정말 원하는 것은 당신이'File'으로 무엇을 할 것 인 파일 –

+0

입니다 : (아래 그루비로 작성)? – Bozho

+1

파일을 필요로하는 API에 전달하십시오. –

17

무엇입니까?

정확한 방법은 불가능하기 때문에 전혀 수행하지 않습니다. File은 특수 파일 시스템이없는 경우 JAR 항목이 아닌 파일 시스템의 실제 파일을 나타냅니다.

데이터가 필요한 경우 getInputStream()을 사용하십시오. File 개체를 요구하는 API를 만족해야한다면 임시 파일을 만들고 입력 스트림에서 해당 파일로 데이터를 복사해야합니다.

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

아마 텍스트 파일 항아리 안에 :

+0

getInputStream()을 사용하여 예제를 표시 할 수 있습니까? –

+1

@David Williams : getFile() 대신 getInputStream()을 호출하기 만하면됩니다. –

-1

당신이 자원 문서에 제공된 link 얼핏 다음 말한다? 이 경우 내용을 읽으려면 getInputStream()을 사용해야합니다.

-1

예를 들어 답변에 추가하면됩니다. JAR 내에서 File (내용 만이 아님)이 필요하면 먼저 자원에서 임시 파일을 만들어야합니다.

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() 
    }