2011-02-07 14 views
25
FileInputStream in = new FileInputStream(myFile); 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 

प्रश्न: मैं कैसे एक तरह से जो एक हाथ से तैयार अपने ही बाइट बफर के साथ पाश नहीं है में in से सब कुछ out में पढ़ सकते हैं?एक स्ट्रीम को दूसरे में कैसे पढ़ा जाए?

+0

संभव डुप्लिकेट एक आउटपुटस्ट्रीम में इनपुटस्ट्रीम] (http://stackoverflow.com/questions/43157/easy-way-to-write-contents-of-a-java-inputstream-to-an-outputstream) – rds

उत्तर

30

ऐसा करने के लिए एक विधि लिखें, और इसे हर जगह से कॉल करें जिसे कार्यक्षमता की आवश्यकता है। Guava में पहले से ही ByteStreams.copy में कोड है। मुझे यकीन है कि "सामान्य" आईओ कार्यक्षमता के साथ किसी अन्य पुस्तकालय के बारे में भी यह है, लेकिन जहां संभव हो, अमरूद की पहली "जाने-जाने" लाइब्रेरी है। यह चट्टानें :)

+0

'बाइटस्ट्रीम' के रूप में एनोट किया गया है 'बीटा 'क्या कोई मुद्दा नहीं है? – gabuzo

+2

@gabuzo: यह इस बात पर निर्भर करता है कि आप कितने जोखिम के विपरीत हैं। मुझे संदेह है कि यह बहुत ही असंभव है कि वह विधि कॉल बदल जाएगी, और मुझे यकीन है कि कार्यान्वयन ठीक है। –

+1

भले ही यह बदलता या गायब हो जाता है, भले ही आप अपग्रेड करते समय इसे ठीक करना पड़े। विधि सरल है और स्रोत कोड उपलब्ध है (यहां तक ​​कि सबवर्सन रेपो)। – maaartinus

2

वैकल्पिक रूप से अमरूद में Apache Commons IO (पुराना), और Apache Commons IOUtils (टिप्पणी में सलाह के रूप में नया) का उपयोग कर सकता है।

+2

* बहिष्कृत। IOUtils का प्रयोग करें। 2.0 में हटा दिया जाएगा। विधियों का नाम बदलकर IOUtils.write() या IOUtils.copy() * –

+0

@ सेन पैट्रिक फ्लॉइड थैंक्स - ने जवाब अपडेट किया है। – 01es

17

Apache Commons/IO में, आप इसे IOUtils.copy(in, out) उपयोग कर सकते हैं:

InputStream in = new FileInputStream(myFile); 
OutputStream out = new ByteArrayOutputStream(); 
IOUtils.copy(in, out); 

लेकिन मैं जॉन स्कीट से सहमत हैं, मैं नहीं बल्कि प्रयोग करेंगे अमरूद के ByteStreams.copy(in, out)

0

मैं बजाय नए आयात करने की, पाश का उपयोग करेंगे कक्षाएं, या मेरी परियोजना में पुस्तकालय जोड़ना। पुस्तकालय समारोह शायद एक लूप के साथ भी लागू किया गया है। लेकिन यह सिर्फ मेरा व्यक्तिगत स्वाद है।

हालांकि, मेरा प्रश्न है: आप क्या करने की कोशिश कर रहे हैं? "बड़ी तस्वीर" के बारे में सोचें, अगर आप किसी फ़ाइल की संपूर्ण सामग्री को बाइट सरणी में रखना चाहते हैं, तो ऐसा क्यों न करें? Arrray का आकार file.length() है, और आपको गतिशील रूप से बढ़ने की आवश्यकता नहीं है, बाइटएरेऑटपुटस्ट्रीम के पीछे छिपा हुआ है (जब तक आपकी फ़ाइल साझा नहीं की जाती है, और जब आप पढ़ते समय इसकी सामग्री बदल सकती है)।

एक और विकल्प: क्या आप एक फ़ाइलChannel और एक बाइटबफर (java.nio) का उपयोग कर सकते हैं?

11

तो क्या हुआ अमरूद के ByteStreams.copy (में, बाहर) करता है:

private static final int BUF_SIZE = 0x1000; // 4K 

    public static long copy(InputStream from, OutputStream to) 
     throws IOException { 
    checkNotNull(from); 
    checkNotNull(to); 
    byte[] buf = new byte[BUF_SIZE]; 
    long total = 0; 
    while (true) { 
     int r = from.read(buf); 
     if (r == -1) { 
     break; 
     } 
     to.write(buf, 0, r); 
     total += r; 
    } 
    return total; 
    } 
+0

यह भी देखें http://stackoverflow.com/a/22646404/1497139 –

2

अपने प्रोजेक्ट में मैं इस विधि का इस्तेमाल किया:

private static void copyData(InputStream in, OutputStream out) throws Exception { 
    byte[] buffer = new byte[8 * 1024]; 
    int len; 
    while ((len = in.read(buffer)) > 0) { 
     out.write(buffer, 0, len); 
    } 
} 
[आसान तरीका एक जावा की सामग्री लिखने के लिए की
+1

यह दूसरों के लिए सहायक हो सकता है यदि आप समझते हैं कि आपका कोड अलग क्यों है और यह समस्या को कैसे हल करता है –

+0

आप सही हैं। मैंने अपना जवाब संपादित किया। – Sergey

+0

संक्षिप्त कोड और पुस्तकालयों का उपयोग नहीं। –

संबंधित मुद्दे