2014-08-29 15 views
0

的替代品我在我的應用程序中升級Guava庫。我在幾個地方有以下結構,創建&從InputStream寫入File棄用Files.copy,ByteStreams.copy,InputSupplier

File destination; 
InputStream myInputStream; 
. 
. 
. 
Files.copy(new InputSupplier<InputStream>() { 
    @Override 
    public InputStream getInput() throws IOException { 
     return myInputStream; 
    } 
}, destination); 

的問題是,InputSupplierFiles.copy已經過時,像ByteStreams.copy一些其他的替代品已被棄用,以及

誰能告訴我,如果有番石榴一個天然替代品來寫一個任意的InputStream到文件?

回答

4

返回myInputStreamopenStream是非常危險的,也不怎麼ByteSource旨在使用。 ByteSource.openStream()應該打開一個新的InputStream

相反,您應該使用Files.asByteSink(destination).writeFrom(myInputStream),或者您應該將myInputStream的創建移動到openStream()實現。

+1

至於_why_這是危險的:問題依賴於它來關閉你的'InputStream'。通常,通過使用try-finally(或理想的情況下,使用Java 7,試用資源),與開放流相同的代碼通常也應確保流是關閉的。在'openStream()'中打開流的'ByteSource'將爲你打開和關閉流。如果它不打開流本身,則其他代碼應該真正負責關閉流,因爲在某些情況下,可能無法關閉流。 – ColinD 2014-08-29 15:42:53

+0

哇,很高興知道這一切,感謝您的深入解釋 – rupps 2014-08-29 18:40:49

1

javadoc的建議 與from.copyTo(Files.asByteSink(destination))取代File.copy其中from必須是ByteSource代替的InputSupplier

所以,你的代碼必須按以下方式進行更改:

new ByteSource() { 
    @Override 
    public InputStream openStream() throws IOException { 
     return myInputStream; 
    } 
}.copyTo(Files.asByteSink(destination));