InputStream को Virtual File में कैसे Convert करें


82

मेरे पास एक तरीका है जो इनपुट चर में से एक की अपेक्षा करता है java.io.File प्रकार लेकिन मुझे जो भी मिलता है वह केवल InputStream है। इसके अलावा, मैं विधि के हस्ताक्षर नहीं बदल सकता।

मैं वास्तव में फाइल सिस्टम पर फाइल लिखने के साथ इनपुटस्ट्रीम को फाइल प्रकार में कैसे बदल सकता हूं?


क्या यह एक अंतर्निहित कार्य है? या यह एक कस्टम फ़ंक्शन है?
रिचर्ड जे। रॉस III

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

FileInputStream की बजाय आपको ऑब्जेक्ट की आवश्यकता क्यों है ?
Poindexter

2
मैं InputStream का उपयोग नहीं कर सकता क्योंकि API मैं मैंडेट्स फ़ाइल का उपयोग कर रहा हूँ
Ram

मुझे लगता है कि किसी ने एक टूटी हुई एपीआई को डिज़ाइन किया है जो केवल
इनपुटस्ट्रीम के

जवाबों:


123

कुछ इस तरह से काम करना चाहिए। ध्यान दें कि सादगी के लिए, मैंने एक जावा 7 सुविधा (क्लोज करने योग्य संसाधन के साथ ब्लॉक की कोशिश) का उपयोग किया है, और अपाचे कॉमन्स-आईआईओ से आईओटीएल। यदि आप उन का उपयोग नहीं कर सकते हैं तो यह थोड़ा लंबा होगा, लेकिन एक ही विचार।

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

}

8
CreateTempFile वास्तव में एक वास्तविक फ़ाइल नहीं लिखता है, जिसे आप फ़ाइल-सिस्टम में देख सकते हैं?
Android डेवलपर

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

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

4
सामान्यतया, मैं एप्लिकेशन को अस्थायी फ़ाइल को हटाने के लिए पसंद करता हूं जब वह ऐसा करने के लिए समझ में आता है। मैं deleteOnExitएक अतिरिक्त पवित्रता-जांच के रूप में उपयोग करता हूं , कभी भी बिना शर्त इस पर भरोसा नहीं करता। मुझे पता है कि कुछ स्थितियों में ( kill -9उदाहरण के लिए JVM), शटडाउन हुक जो विलोपन करते हैं, उन्हें कभी नहीं बुलाया जाएगा।
cobbzilla

यदि आप Android पर इसका उपयोग कर रहे हैं, तो implementation 'org.apache.directory.studio:org.apache.commons.io:2.4'gradle में जोड़ें ।
लॉर्डपर्सले

30

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


8
वास्तव में, File#createTempFile()यह वास्तव में तुम्हारा सबसे अच्छा दांव है।
बालुसक

7
यह भी देखें File#deleteOnExit(), जो JVM के बाहर निकलने पर JVM फ़ाइल को स्वचालित रूप से हटाने का प्रयास करता है। बेशक, यह अस्थायी रूप से और तुरंत फ़ाइल को हटाने के लिए सबसे अच्छा है, एक बार जब आप जानते हैं कि फ़ाइल की आवश्यकता नहीं है और अब उपयोग में नहीं है। लेकिन एक अपूर्ण दुनिया में कभी-कभी अपूर्ण समाधान आवश्यक होते हैं।
माइक क्लार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.