2010-10-31 4 views
6

में इनपुट इनपुट की गहरी प्रतिलिपि बनाने के लिए कैसे मैं जानना चाहता हूं कि InputStream की गहरी प्रति कैसे बनाएं।जावा

मुझे पता है कि यह IOUtils पैकेज के साथ किया जा सकता है, लेकिन यदि संभव हो तो मैं उनसे बचना चाहूंगा। क्या किसी को वैकल्पिक तरीके से पता है?

+0

क्यों आप ऐसा करना चाहते हैं? अफैक आप एक स्ट्रीम से दो बार नहीं पढ़ सकते हैं। – thejh

+0

कुछ अजीब कारणों से मुझे लगता है कि एक बार मैंने इसका इस्तेमाल किया था। तो सुर बनाने के लिए यह मामला नहीं है, मैं एक गहरी प्रतिलिपि बनाना चाहता हूं। मैं एंड्रॉइड के साथ काम कर रहा हूं और आरईएसटी आर्किटेक्चर का उपयोग कर एक webservice से छवियां प्राप्त कर रहा हूं। – Spredzy

+4

आप हमें प्रासंगिक कोड क्यों नहीं दिखाते हैं और आपके पास वास्तविक समस्या की व्याख्या क्यों करते हैं? –

उत्तर

16

इनपुटस्ट्रीम सार है और आंतरिक डेटा ऑब्जेक्ट्स का खुलासा नहीं करता है (न ही इसके बच्चों को)। तो इनपुटस्ट्रीम की "गहरी प्रतिलिपि" का एकमात्र तरीका बाइटएरे ऑटपुटस्ट्रीम बनाना और इनपुटस्ट्रीम पर पढ़ने() करने के बाद, इस डेटा को ByteArrayOutputStream पर लिखें()। तो फिर कार्य करें:

newStream = new ByteArrayInputStream(byteArrayOutputStream.toArray()); 

आप अपने InputStream पर mark() उपयोग कर रहे हैं तो वास्तव में आप इस पलट नहीं सकते। यह आपकी धारा "उपभोग" बनाता है।

अपने इनपुटस्ट्रीम को "पुन: उपयोग" करने के लिए चिह्न() का उपयोग करने से बचें और फिर कॉल रीसेट() पढ़ने के अंत में। फिर आप धारा की शुरुआत से पढ़ रहे होंगे।

संपादित:

Btw, IOUtils InputStream कॉपी करने के लिए इस सरल कोड स्निपेट का उपयोग करता है:

public static int copy(InputStream input, OutputStream output) throws IOException{ 
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
    int count = 0; 
    int n = 0; 
    while (-1 != (n = input.read(buffer))) { 
     output.write(buffer, 0, n); 
     count += n; 
    } 
    return count; 
} 

और अधिक पढ़ें: http://kickjava.com/src/org/apache/commons/io/CopyUtils.java.htm#ixzz13ymaCX9m

+0

क्या आप आमतौर पर इस विधि के साथ उपयोग करते हैं DEFAULT_BUFFER_SIZE du? –