अगर आप सीधे तक पहुँचने byte[]
डेटा के लिए (सीमाओं का पता लगाने के लिए उपयोग memoryStream.Position
और memoryStream.Length
) memoryStream.getBuffer()
और ऑफसेट/लंबाई का उपयोग बेहतर होगा, Reader
/Writer
/BinaryFormatter
कक्षाएं, या अन्य वर्गों Stream
को स्वीकार करने, पढ़ने के लिए/लिख आदिम/बफर में जटिल प्रकार (यही MemoryStream
के लिए बनाया गया है), आप बेकार प्रतिलिपि संचालन के बिना प्रबंधित करते हैं, क्योंकि MemoryStream
पहले से ही बाइट-सरणी पर आधारित है।
मैं इसे अतुल्यकालिक भेजने के साथ इस तरह से इस्तेमाल किया/byte[]
स्वीकार करने सॉकेट आपरेशन प्राप्त करते हैं, लेकिन सावधान रहना - अगर आप अपने वर्तमान Length
परे बफर में कुछ लिखा था और रीडर वर्ग के साथ पढ़ने के लिए SetLength()
साथ इसकी लंबाई बढ़ाने के लिए चाहते हैं - आप बहुत असुविधाजनक मिल व्यवहार (मेरी राय में) - यह विधि लंबाई बढ़ने पर पुरानी लंबाई और नई लंबाई के बीच हर बाइट को हटा देती है।
मैंने MemoryStream
के MemoryStream
के स्रोत कोड (एक Array.Clear कॉल SetLength()
, और .NET के आंतरिक वर्गों के बिना प्रबंधित करने के लिए कुछ अतिरिक्त) को संशोधित करके इस समस्या को हल किया और इसे मेरे प्रोजेक्ट में उपयोग करके हल किया।
MemoryStream पुन: उपयोग के लिए के रूप में, मैं क्रिस टेलर के जवाब (SetLength(0)
)
ज़रूर से सहमत - लेकिन अगर धारा पहले से ही 100 बाइट का है और मैं 99 बाइट्स तो लिखने जब मैं इस धारा मैंने पढ़ा होगा की सामग्री पढ़ने के लिए आते हैं बहुत अधिक :) –
@CycleMachine - एक कारण है कि स्मृति स्ट्रीम को रीसेट/समाशोधन क्यों नहीं बनाया गया है। मैंने जो लिंक जोड़ा है उसे देखें। – Oded
यदि आप एक बड़ा बफर आवंटित करते हैं तो यह बफर बनाम हर बार पुन: उपयोग करने के लिए अधिक कुशल होगा। स्थिति को सेट करने के बजाय आप सेटलेथेंथ (0) का उपयोग कर सकते हैं (नीचे मेरा जवाब देखें) जो बफर को आवंटित करेगा और आंतरिक काउंटर, लंबाई और स्थिति को रीसेट करेगा, जो अक्सर एक बड़े बफर को फिर से आवंटित करने से सस्ता है। –