2010-08-10 20 views
12

Dosya sistemindeki kaynaklarla (dosyalar) çalışmak için Spring'in Resource soyutlamasını kullanıyorum. Kaynaklardan biri, JAR dosyasının içindeki bir dosyadır. Aşağıdaki koda göre, her şey yolunda, ama sonra bir Filealmak Dosya JAR

templateResource.getFile(); 

için Resource dönüştürmeye çalıştığınızda özel durum almak referans Bu noktada

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 

geçerlidir görünür bir JAR dosyası içinde var olan bir Resource bir File başvuru almak için doğru yolu

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) 

nedir? Onu okumak istiyorsan

cevap

4

, sadece çağrı resource.getInputStream()

istisna mesajı oldukça açık - Bir File örneği olamaz bu yüzden dosya, dosya sistemi üzerinde ikamet etmez. Ayrıca - içeriği okumak dışında, File ile ne yapacak? Bir JAR dosyası içine var olan bir kaynak için bir dosya referans almak doğru yolu

+0

bu bana bir InputStream verecektir ama ne gerçekten istiyorum o 'Dosya' ne yapacak Dosya –

+0

bağlıdır: (aşağıda Groovy yazılır)? – Bozho

+1

Bir Dosyaya –

17

nedir?

Doğru yol bunu yapmamakta, çünkü bu imkansızdır. Bir File, bunun için özel bir dosya sisteminiz yoksa, JAR girişi olmayan bir dosya sisteminde gerçek bir dosyayı temsil eder.

Verilere ihtiyacınız varsa, getInputStream()'u kullanın. Bir File nesnesini gerektiren bir API'yi karşılamanız gerekiyorsa, korkarım ki yapabileceğiniz tek şey bir geçici dosya oluşturmak ve verileri giriş akışından kopyalamaktır.

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

Belki metin dosyası bir kavanoza içindeyse:

+0

getInputStream() ile bir örnek gösterebilir misiniz? –

+1

@David Williams: getFile() yerine getInputStream() öğesini çağırın. –

-1

Eğer kaynak belgeleri için sağlanan link hızlı bir bakış aşağıdaki diyor? Bu durumda, içeriğini okumak için getInputStream()'u kullanmanız gerekecektir.

-1

Sadece buradaki cevaplara bir örnek ekliyor. JAR'nızdan bir File (ve sadece içeriğini değil) ihtiyacınız varsa, önce kaynaktan geçici bir dosya oluşturmanız gerekir.

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