2010-11-30 12 views
61

Girdi değişkeninin java.io.File türünde olmasını beklediğim bir yöntem var ancak aldığım sadece InputStream. Yöntemin imzasını değiştiremiyorum. InputStream'i gerçekten dosya sistemi üzerine yazarak dosya türüne nasıl dönüştürebilirim?Nasıl InputStream sanal dosyaya dönüştürmek

+0

Bu yerleşik bir işlev midir? ya da özel bir işlev mi? –

+2

@Richard: * "Yöntemin imzasını değiştiremiyorum." * – BalusC

+0

Neden InputStream yerine "File" nesnesine ihtiyacınız var? – Poindexter

cevap

98

Böyle bir şey işe yaramalıdır. Basitlik için, bir Java 7 özelliği kullandım (kapatılabilir kaynağa sahip bloğu deneyin) ve Apache commons-io'dan IOUtils kullandım. Eğer bunları kullanamazsan biraz daha uzun ama aynı fikirde olacak.

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; 
    } 

} 
+6

OluşturmaTempFile aslında dosya sisteminde görebileceğiniz gerçek bir dosya yazıyor mu? –

+0

teknik olarak doğru. Yukarıdaki kodu kullanarak, program çıkana veya program tarafından silinene kadar geçici dosya mevcut olacaktır. – cobbzilla

+0

deleteOnExit belgeleri, çalışmaya güvenmemelisiniz (ve aslında bir şey yapmadığını düşünüyorum): http://developer.android.com/reference/java/io/File.html#deleteOnExit(). Ayrıca, herhangi bir dosya olmadan sesin nasıl çalınacağını biliyorsanız, lütfen burayı buraya yazın: http://stackoverflow.com/q/36552381/878126 –

27

Yapamazsınız. Giriş akışı sadece genel bir veri akışıdır ve aslında bir Dosyadan kaynaklandığının bir garantisi yoktur. Birisi bir web servisini okumaktan bir InputStream oluşturduysa veya bir String'i bir InputStream'e dönüştürdüyse, bunu bir dosyaya bağlamanın bir yolu olmazdı. Böylece yapabileceğiniz tek şey, aslında akıştan veriyi geçici bir dosyaya (örneğin, File.createTempFile yöntemini kullanarak) yazıp bu dosyayı yönteminize beslemektir.

+6

Gerçekten, ['Dosya # createTempFile()'] (http://download.oracle.com/javase/6/docs/api/java/io/File .html # createTempFile% 28java.lang.String,% 20java.lang.String% 29) gerçekten en iyi bahistir. – BalusC

+6

Ayrıca bkz. ['Dosya # deleteOnExit()'] (http://download.oracle.com/javase/6/docs/api/java/io/File.html#deleteOnExit%28%29), bu da JVM'ye neden olur. JVM çıktığında dosyayı otomatik olarak silmeyi denemek. Tabii ki, dosya artık gerekmediğinde ve artık kullanılmadığında, geçici dosyayı el ile ve hemen silmek en iyisidir. Ancak kusurlu bir dünyada bazen kusurlu çözümler gereklidir. –

İlgili konular