क्या इनपुटस्ट्रीम से फाइल ऑब्जेक्ट बनाना संभव है


121

क्या किसी java.io.Fileवस्तु को बनाने का कोई तरीका है java.io.InputStream?

मेरी आवश्यकता एक आरएआर से फाइल को पढ़ रही है। मैं एक अस्थायी फ़ाइल लिखने का प्रयास नहीं कर रहा हूं, मेरे पास RAR संग्रह के अंदर एक फ़ाइल है जिसे मैं पढ़ने की कोशिश कर रहा हूं।


1
मेरी आवश्यकता एक आरएआर से फाइल को पढ़ रही है। मान लें कि मैं RAR से अस्थायी फ़ाइल लिखने की कोशिश नहीं कर रहा हूँ, RAR के अंदर एक फ़ाइल है, बस मुझे पढ़ने की आवश्यकता है।
androidgalaxyman

मुझे सवाल समझ नहीं आ रहा है। कृपया स्पष्ट करें। यदि आप InputStream से oriinal फ़ाइल चाहते हैं, तो कोई एक नहीं थी: आप RAR फ़ाइल पढ़ रहे हैं, फ़ाइल नहीं। यदि आप कुछ और चाहते हैं, तो क्या?
लोर्ने का जुलूस

जवाबों:


87

आपको नई फ़ाइल बनाने और InputStreamउस फ़ाइल से सामग्री कॉपी करने की आवश्यकता है:

File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
    IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
    // handle exception here
} catch (IOException e) {
    // handle exception here
}

मैं IOUtils.copy()स्ट्रीम की मैन्युअल कॉपी से बचने के लिए सुविधाजनक उपयोग कर रहा हूं । साथ ही इसमें बिल्ट-इन बफरिंग है।


3
एंड्रॉइड स्टूडियो में IOUtils को हल नहीं कर सका और आपके द्वारा संदर्भित लिंक 404 है।
शहराईज टी।

3
org.apache.directory.studio:org.apache.commons.io को एक निर्भरता के रूप में जोड़ने की आवश्यकता है। मेरी गलती। :)
शारिज़ टी।

7
कृपया आउटपुटस्ट्रीम को सही ढंग से बंद करें, संसाधनों या IOUtils.closeQuietly के साथ प्रयास करें। मुझे इसका एक उदाहरण पता है, लेकिन शुरुआती इसे सचमुच कॉपी करेंगे।
राफेल मेम्ब्रिज


29

पहले एक अस्थायी फ़ाइल बनाएँ।

File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;

कृपया IOUtils के पैकेज का नाम शामिल करें
Ridhuvarshan

org.apache.commons.io
शेहान सिमेन

यह org.apache.axis2.util में कॉपी फ़ंक्शन के तीसरे पैरामीटर के साथ भी मौजूद है। कार्यक्षमता वहाँ भी काम करती है। क्या उपयोग करने पर कोई तुलना?
रिधुदर्शन

26

जावा 7 के बाद से, आप इसे किसी भी बाहरी पुस्तकालयों का उपयोग किए बिना भी एक पंक्ति में कर सकते हैं:

Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);

एपीआई डॉक्स देखें ।


2
यदि आप एंड्रॉइड के साथ इसका उपयोग करते हैं, तो 26 के एक एसडी एसडीके की आवश्यकता होती है।
Neph

3

यदि आप अन्य लाइब्रेरी का उपयोग नहीं करना चाहते हैं, तो यहां कन्वर्ट InputStreamकरने के लिए एक सरल फ़ंक्शन है OutputStream

public static void copyStream(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}

अब आप आसानी से एक Inputstreamफ़ाइल का उपयोग करके लिख सकते हैं FileOutputStream-

FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();

1

संसाधन ब्लॉक के साथ कोशिश करने के साथ आसान जावा 11 समाधान

public static void copyInputStreamToFile(InputStream input, File destination) {  

    try (OutputStream output = new FileOutputStream(destination)) {
        input.transferTo(output);
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }

}

जावा 9 के बाद से java.io.InputStream # transferTo उपलब्ध है।


0

यदि आप जावा संस्करण 7 या उच्चतर का उपयोग कर रहे हैं, तो आप ठीक से बंद करने के लिए कोशिश-के-संसाधनों का उपयोग कर सकते हैं FileOutputStream। निम्नलिखित कोड कॉमन्स-आईओIOUtils.copy() से उपयोग करते हैं ।

public void copyToFile(InputStream inputStream, File file) throws IOException {
    try(OutputStream outputStream = new FileOutputStream(file)) {
        IOUtils.copy(inputStream, outputStream);
    }
}  

क्या आपको आउटपुटस्ट्रीम को बंद करने की आवश्यकता नहीं है? जैसे टॉमस एन से जवाब में
ट्रिनिटी 420

3
@ ट्रिनिटी 420 संसाधन tryप्रारंभिक भाग में निर्दिष्ट tryब्लॉक के बाहर निकलने पर स्वचालित रूप से बंद हो जाते हैं।
h3xStream
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.