2011-12-22 32 views
10

मैं सीख रहा हूं कि इनपुट इनपुट का उपयोग कैसे करें। मैं BufferedInputStream के लिए चिह्न का उपयोग करने की कोशिश कर रहा था, लेकिन मैं इन अपवादों है जब मैं रीसेट करने का प्रयास:बुफर्ड इनपुट स्ट्रीम मार्क पढ़ने की सीमा

java.io.IOException: Resetting to invalid mark 

मैं इसका मतलब यह मेरा निशान पढ़ा है कि सीमा गलत सेट कर दिया जाता है। मैं वास्तव में नहीं जानता कि कैसे निशान() में पढ़ने की सीमा निर्धारित करें। मैंने इस तरह कोशिश की:

is = new BufferedInputStream(is); 
is.mark(is.available()); 

यह भी गलत है।

is.mark(16); 

यह भी एक ही अपवाद फेंकता है। मुझे कैसे पता चलेगा कि मुझे पढ़ने की सीमा क्या है? चूंकि मैं इनपुट स्ट्रीम से अलग-अलग फ़ाइल आकार पढ़ रहा हूं।

+2

मेरा निजी लेना? चिह्न का उपयोग न करें - जबकि मुझे यकीन है कि एक है, मुझे अभी तक इसके लिए एक अच्छा कारण नहीं मिला है। अक्सर यह पहली जगह में खराब हैंडलिंग का संकेत है। मैं एक धारा के रूप में एक धारा के रूप में सोचने के लिए प्रवृत्त नहीं करता जब तक कि मैं अपने सबसे कच्चे रूप से निपट रहा हूं। इसके बजाय इसके चारों ओर एक तंग आवरण होगा जो इसकी जानकारी प्राप्त करता है, इसे संकुल करता है, और उस पैकेज को ऐप में कहीं भी प्रोसेस करने के लिए भेजता है। – corsiKa

+0

@glowcoder आपकी टिप्पणी के लिए धन्यवाद। जैसा कि मैंने पहले कहा था, मैं इनपुटस्ट्रीम के साथ काम करने में नया हूं। मैं वास्तव में दो बार इनपुट स्ट्रीम का उपयोग करने की कोशिश कर रहा था। मैंने सोचा कि यह करने का यह तरीका है। निशान सेट करना और रीसेट करना। क्या आपके पास यह सुझाव है कि इसे कैसे प्राप्त किया जाए? –

+3

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

उत्तर

0

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

+0

धन्यवाद का उपयोग करें, i शुरुआत में इसे रीसेट करने की योजना बना रहा था। लेकिन अब मुझे लगता है कि यह एक अच्छा विचार नहीं है। जब आपने कहा कि मुझे इसे temp फ़ाइल में कॉपी करना चाहिए, तो क्या इसका मतलब है कि इसे इसे इस्तेमाल करने से पहले मुझे अपने फ़ोल्डर में कहीं और स्टोर करना होगा? –

+0

@NurAini - हाँ, एक temp फ़ाइल बनाएं, उसमें स्ट्रीम कॉपी करें, फिर आप उस temp फ़ाइल को जितनी बार चाहें उतनी बार फिर से पढ़ सकते हैं। – jtahlborn

6

mark कभी-कभी उपयोगी होता है यदि आपको कुछ बाइट्स का निरीक्षण करने की आवश्यकता होती है जो आपने तय किया है कि आगे क्या करना है, तो आप वापस निशान पर रीसेट करें और उस दिनचर्या को कॉल करें जो फ़ाइल सूचक को शुरुआत में होने की अपेक्षा करता है इनपुट के उस तार्किक हिस्से का। मुझे नहीं लगता कि यह वास्तव में और अधिक के लिए है।

आप BufferedInputStream के लिए जावाडोक को देखें, तो यह कहता है

निशान आपरेशन इनपुट स्ट्रीम में एक बिंदु याद रखता है और रीसेट आपरेशन सभी बाइट्स सबसे हाल ही में मार्क ऑपरेशन के बाद से पढ़ने के नए से पहले पुन: पढ़ने जा करने के लिए कारण बनता है बाइट्स निहित इनपुट स्ट्रीम से लिया जाता है।

यहाँ याद करने के लिए महत्वपूर्ण बात यह है कि एक बार आप धारा में एक स्थान को चिह्नित, अगर आप चिह्नित लंबाई परे पढ़ने रखने के लिए, निशान अब वैध नहीं हो जाएगा, और कॉल रीसेट करने के लिए असफल हो जायेगी। तो विशिष्ट परिस्थितियों के लिए निशान अच्छा है और अन्य मामलों में ज्यादा उपयोग नहीं है।

+0

आपकी टिप्पणी के लिए धन्यवाद। जब आपने कहा कि 'यदि आप पढ़ते रहते हैं और बफर को फिर से भरना होगा'। क्या ऐसा हो रहा है क्योंकि मैंने BufferedInputStream का उपयोग किया था? –

+0

हां, हालांकि, unbuffered io धाराएं निशान का समर्थन नहीं करती हैं और रीसेट नहीं करती हैं। – Bill

1

यह उसी BufferedInputStream से 5 बार पढ़ेगा।

for (int i=0; i<5; i++) { 
    inputStream.mark(inputStream.available()+1); 
    // Read from input stream 
    Thumbnails.of(inputStream).forceSize(160, 160).toOutputStream(out); 
    inputStream.reset(); 
} 
संबंधित मुद्दे