2016-05-22 42 views
3

我試圖將我的項目中的資源複製到磁盤上的另一個位置。到目前爲止,我有這樣的代碼:如何將資源複製到Java中另一個位置中的文件

if (!file.exists()){ 
    try { 
     file.createNewFile(); 
     Files.copy(new InputSupplier<InputStream>() { 
      public InputStream getInput() throws IOException { 
       return Main.class.getResourceAsStream("/" + name); 
      } 
     }, file);     
    } catch (IOException e) { 
     file = null; 
     return null; 
    } 
} 

,它工作正常,但InputSupplier類是過時了,所以我在想,如果有一個更好的辦法做我想要做的事。

回答

4

查看文檔的番石榴InputSupplier class

對於InputSupplier<? extends InputStream>,使用ByteSource代替。對於InputSupplier<? extends Reader>,請使用CharSource。不屬於這些類別之一的InputSupplier的實現不受益於common.io中的任何方法,並應使用不同的接口。這個接口定於去除2015年12月

你的情況

所以,你正在尋找ByteSource

Resources.asByteSource(url).copyTo(Files.asByteSink(file)); 

更多信息,請參見番石榴維基this section


如果你正在尋找一個純Java(無外部庫)的版本,你可以做到以下幾點:

try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("/" + name)) { 
    Files.copy(is, Paths.get("C:\\some\\file.txt")); 
} catch (IOException e) { 
    // An error occurred copying the resource 
} 

注意,這是唯一有效的Java 7和更高。

+0

我剛剛找到純java解決方案,並即將發佈它,然後我看到了您的編輯。謝謝一堆! – NonameSL

+0

請注意,您顯示的純Java版本與Guava版本有重要區別:它甚至不嘗試關閉資源流。 Guava版本保證複製後關閉流,無論它是成功還是失敗。 – ColinD

相關問題