2010-09-20 7 views
11

बाइनरी रीडर में एंडऑफस्ट्रीम संपत्ति नहीं है। स्ट्रीम के अंत तक पहुंचने के लिए यह जांचने के लिए निम्नलिखित कोड का उपयोग करना सुरक्षित है?बाइनरी रीडर के लिए एंडऑफस्ट्रीम

reader.BaseStream.Length>reader.BaseStream.Position

+0

पढ़ नहीं सकते हैं किस प्रकार की स्ट्रीम? सभी धाराओं को उनकी लंबाई सामने नहीं पता है। –

उत्तर

7

पर किसी भी नेटवर्किंग बेस स्ट्रीम जैसे यह निर्भर करता है। ऐसे कई प्रकार के प्रकार हैं जो लंबाई या स्थिति संपत्ति को लागू नहीं करते हैं, आपको एक समर्थित समर्थन प्राप्त होगा। उदाहरण के लिए नेटवर्कस्ट्रीम। बेशक, यदि आप ऐसी स्ट्रीम का उपयोग करेंगे तो आपको वास्तव में यह जानना होगा कि कितनी बार BinaryReader को कॉल करें। पढ़ें() विधि। तो, हाँ, यह ठीक है।

+1

यह एक ऐसी स्थिति हो सकती है जब आप एक NetworkStream के अंत तक पढ़ने के लिए (जो तब होता है जब दूसरे पक्ष कनेक्शन बंद कर देता है) की जरूरत है सार्वभौमिक नहीं है ...। – torvin

+0

उम्मीद है कि दूसरी तरफ अलविदा अच्छी तरह से कहता है। यदि ऐसा नहीं होता है तो जब आप बंद कनेक्शन से पढ़ना जारी रखते हैं तो अपवाद निश्चित रूप से सार्वभौमिक होता है। –

-1

है यही कारण है कि मैं हमेशा पहले कर चुके हैं और मैं इसके साथ एक समस्या कभी नहीं देखा। इसका उपयोग करने वाला कोड 2+ वर्षों के लिए उत्पादन वातावरण में रहा है।

+5

इसे कभी-कभी DeflateStream पर आज़माएं। । । –

+0

और किस तरह की धारा के साथ? –

+0

@ जिम मुझे यह नहीं पता था। यह अच्छी जानकारी है, धन्यवाद। हेनक का जवाब तब +1 हो जाता है। –

2

यह एक सामान्य समाधान के रूप में काम नहीं करेगा क्योंकि यह मानता है कि BaseStream मूल्य Length संपत्ति का समर्थन करता है। कई Stream कार्यान्वयन नहीं करते हैं और इसके बजाय NotSupportedException फेंकते हैं। विशेष रूप से HttpRequestStream और NetworkStream

10

मुझे मिला सबसे आसान तरीका बाइनरी रीडर की PeekChar() विधि के लौटे हुए मूल्य की जांच करना है। यदि यह -1 लौटाता है, तो आप स्ट्रीम के अंत तक पहुंच जाते हैं।

+1

यह तब तक काम करता है जब तक अंतर्निहित स्ट्रीम मांग का समर्थन नहीं करता है। –

+0

हां, मुझे यह भी पता चला कि व्यावहारिक रूप से, यदि आप अक्सर 'पीककहर()' कहते हैं, तो फाइलों से निपटने में यह बहुत धीमी हो सकती है। –

+0

साथ ही, यह एक अपवाद फेंकने लगता है अगर उस स्थिति का डेटा एक अवैध चरित्र होता है। मुझे कभी-कभी यह मिलता है: 'System.ArgumentException: आउटपुट चार बफर डीकोडेड वर्णों को शामिल करने के लिए बहुत छोटा है,' यूनिकोड (यूटीएफ -8) 'फ़ॉलबैक' सिस्टम एन्कोडिंग। टेक्स्ट.कोडोडर रिप्लेसमेंट फ़ॉलबैक '। –

1

मैंने देखा है कि स्थिति की लंबाई की तुलना स्ट्रीमरडर पर काम नहीं करती है भले ही अंतर्निहित बेसस्ट्रीम मांग का समर्थन करता हो। ऐसा लगता है कि StreamReader बेसस्ट्रीम से आगे पढ़ता है। यही कारण है कि StreamReader एक EndOfStream प्रॉपर्टी की आपूर्ति करता है, जो एक अच्छी बात है, और मेरी इच्छा है कि बाइनरी रीडर ने वही किया।

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

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

0

स्ट्रीम्स CanSeek संपत्ति की जांच करें। यदि यह संपत्ति सत्य लौटाती है तो आप धारा के अंत में स्ट्रीम की स्थिति की तुलना कर सकते हैं ताकि आप यह कह सकें कि आप स्ट्रीम के अंत में हैं या नहीं। यदि यह संपत्ति झूठी वापसी करती है तो यह काम नहीं करेगी।

नेटवर्क के लिए धाराओं आप उपलब्ध बाइट्स के अंत के बीच अंतर करने की आवश्यकता हो सकती (दूसरे छोर पर ग्राहक अभी भी लिखने के लिए और अधिक है, लेकिन अभी तक नहीं है) और धारा बंद किया जा रहा। एक अंतर्निहित टीसीपी कनेक्शन के लिए IsConnected संपत्ति स्ट्रीम बंद होने पर जानने के लिए विश्वसनीय नहीं है। कंप्यूटर के कनेक्शन को गिनना संभव है और देखें कि आप जिस स्ट्रीम का उपयोग कर रहे हैं वह उनमें से है। यह अधिक विश्वसनीय है, लेकिन अधिक जटिल है। IOExceptions को संभालने के लिए बेहतर हो सकता है जब आप

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