2010-11-30 10 views
61

मेरे पास एक तरीका है जो इनपुट वैरिएबल में से एक java.io.File प्रकार के होने की अपेक्षा करता है लेकिन मुझे जो मिलता है वह केवल इनपुटस्ट्रीम है। मैं विधि के हस्ताक्षर को बदल नहीं सकता। मैं इनपुटस्ट्रीम को फ़ाइल प्रकार में वास्तव में फ़ाइल सिस्टम पर फ़ाइल लिखने के साथ कैसे परिवर्तित कर सकता हूं?इनपुटस्ट्रीम को वर्चुअल फ़ाइल में कनवर्ट करने के लिए कैसे करें

+0

क्या यह एक अंतर्निहित कार्य है? या यह एक कस्टम समारोह है? –

+2

@ रिचर्ड: * "मैं विधि के हस्ताक्षर को नहीं बदल सकता।" * – BalusC

+0

आपको इनपुटस्ट्रीम की बजाय 'फ़ाइल' ऑब्जेक्ट की आवश्यकता क्यों है? – Poindexter

उत्तर

98

ऐसा कुछ काम करना चाहिए। ध्यान दें कि सादगी के लिए, मैंने जावा 7 फीचर (क्लोजेबल रिसोर्स के साथ ब्लॉक करने का प्रयास करें) का उपयोग किया है, और अपाचे कॉमन्स-आईओ से 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; 
    } 

} 
+6

नहीं बनाया गया है TempFile वास्तव में एक वास्तविक फ़ाइल लिखता है, जिसे आप फ़ाइल-सिस्टम में देख सकते हैं? –

+0

आप तकनीकी रूप से सही हैं। उपर्युक्त कोड का उपयोग करके, temp फ़ाइल तब तक मौजूद रहेगी जब तक प्रोग्राम बाहर निकलता है या प्रोग्राम द्वारा इसे हटा दिया जाता है। – cobbzilla

+0

deleteOnExit के दस्तावेज़ों का कहना है कि आपको काम पर भरोसा नहीं करना चाहिए (और मुझे लगता है कि यह वास्तव में कुछ भी नहीं करता है): http://developer.android.com/reference/java/io/File.html#deleteOnExit()। इसके अलावा, अगर आप किसी भी फ़ाइल के बिना ऑडियो को स्ट्रीम करने के बारे में जानते हैं, तो कृपया इसके बारे में यहां लिखें: http://stackoverflow.com/q/36552381/878126 –

27

आप नहीं कर सकते। इनपुट स्ट्रीम केवल डेटा की एक सामान्य धारा है और इसकी कोई गारंटी नहीं है कि यह वास्तव में एक फ़ाइल से निकलती है। अगर किसी ने एक इनपुट सेवा को एक वेब सेवा पढ़ने से बनाया है या सिर्फ स्ट्रिंग को इनपुट इनपुट में परिवर्तित किया है, तो इसे फ़ाइल से लिंक करने का कोई तरीका नहीं होगा। तो एकमात्र चीज जो आप कर सकते हैं वह वास्तव में स्ट्रीम से डेटा को अस्थायी फ़ाइल में लिखता है (उदा। File.createTempFile विधि का उपयोग करके) और इस फ़ाइल को अपनी विधि में फ़ीड करें।

+6

वास्तव में, ['फ़ाइल # createTempFile()'] (http://download.oracle.com/javase/6/docs/api/java/io/File .html # createTempFile% 28java.lang.String,% 20java.lang.String% 29) वास्तव में आपकी सबसे अच्छी शर्त है। – BalusC

+6

यह भी देखें ['फ़ाइल # हटाएंऑनएक्सिट() '] (http://download.oracle.com/javase/6/docs/api/java/io/File.html#deleteOnExit%28%29), जो JVM का कारण बनता है जब JVM बाहर निकलता है तो फ़ाइल को स्वचालित रूप से हटाने का प्रयास करने के लिए। बेशक, फ़ाइल को मैन्युअल रूप से और तत्काल हटाने के लिए सबसे अच्छा है, एक बार जब आपको पता चले कि फ़ाइल की आवश्यकता नहीं है और अब उपयोग में नहीं है। लेकिन एक अपूर्ण दुनिया में कभी-कभी अपूर्ण समाधान आवश्यक होते हैं। –