2010-11-30 96 views
61

我有一個方法,期望輸入變量的一個是java.io.File類型,但我得到的只是InputStream。我無法更改方法的簽名。如何將InputStream轉換爲File類型,而無需將文件寫入文件系統?如何將InputStream轉換爲虛擬文件

+0

這是一個內置函數嗎?或者它是一種自定義功能? – 2010-11-30 18:20:10

+2

@Richard:*「我無法更改方法的簽名。」* – BalusC 2010-11-30 18:22:45

+0

爲什麼你需要`File`對象而不是InputStream? – Poindexter 2010-11-30 18:23:38

回答

98

像這樣的東西應該工作。請注意,爲了簡單起見,我使用了Java 7功能(嘗試使用可關閉資源的塊)以及Apache commons-io中的IOUtils。如果你不能使用這些,它會更長一些,但是同樣的想法。

import org.apache.commons.io.IOUtils; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 

public class StreamUtil { 

    public static final String PREFIX = "stream2file"; 
    public static final String SUFFIX = ".tmp"; 

    public static File stream2file (InputStream in) throws IOException { 
     final File tempFile = File.createTempFile(PREFIX, SUFFIX); 
     tempFile.deleteOnExit(); 
     try (FileOutputStream out = new FileOutputStream(tempFile)) { 
      IOUtils.copy(in, out); 
     } 
     return tempFile; 
    } 

} 
27

你不能。輸入流只是一個通用的數據流,並不能保證它實際上源於文件。如果有人通過讀取Web服務創建了InputStream,或者只是將String轉換爲InputStream,則無法將其鏈接到文件。因此,您唯一能做的就是將數據從流中寫入臨時文件(例如使用File.createTempFile方法)並將此文件提供給您的方法。

相關問題