स्ट्रीम को बाइट ऐरे में बदलना: C# डेवलपर के लिए गाइड (2025 संस्करण)
\n\nक्या आपने कभी सोचा है: "क्यों, C#, तुम मुझे इस Stream को एक पंक्ति में बाइट ऐरे में बदलने की सुविधा नहीं देते?" यदि हाँ — तो आप अकेले नहीं हैं। Stack Overflow पर "Creating a byte array from a stream" प्रश्न हज़ारों बार देखा जाता है, और यह व्यर्थ नहीं है। काम सरल लगता है, लेकिन शैतान, हमेशा की तरह, विवरणों में है: प्रदर्शन, मेमोरी, एसिंक्रोनसिटी और .NET संस्करण।
2025 में, .NET पारिस्थितिकी तंत्र हमें कई सुरुचिपूर्ण समाधान प्रदान करता है। इस लेख में, हम 5 सर्वश्रेष्ठ प्रथाओं पर चर्चा करेंगे — क्लासिक से लेकर नवीनतम तक। आप जानेंगे कि MemoryStream का उपयोग कब करें, क्यों BinaryReader अभी भी प्रासंगिक है, और विशाल स्ट्रीम के साथ काम करते समय एप्लिकेशन को कैसे "क्रैश" न करें। चलिए शुरू करते हैं!
1. क्लासिक तरीका: MemoryStream और CopyTo
\n\nसबसे लोकप्रिय और सहज तरीका। यदि आपके पास Stream है (जैसे, फ़ाइल, नेटवर्क या मेमोरी से), तो आप इसे MemoryStream में "डाल" देते हैं, फिर ToArray() कॉल करते हैं।
public static byte[] StreamToBytesUsingMemoryStream(Stream inputStream)\n{\n using (var memoryStream = new MemoryStream())\n {\n inputStream.CopyTo(memoryStream);\n return memoryStream.ToArray();\n }\n}\n\nलाभ:
\n- \n
- सरलता और पठनीयता। \n
- .NET के सभी संस्करणों में काम करता है (Framework, Core, 5+)। \n
- एसिंक्रोनस कार्य के लिए
CopyToAsyncका समर्थन करता है। \n
नुकसान:
\n- \n
- यदि स्ट्रीम बहुत बड़ी है (जैसे, 1 जीबी), तो आप डेटा को मेमोरी में दो बार रखते हैं: पहले
MemoryStreamमें, फिर ऐरे में। \n - बहुत छोटी स्ट्रीम के लिए सबसे तेज़ विकल्प नहीं (ऑब्जेक्ट निर्माण का ओवरहेड)। \n
कब उपयोग करें: मध्यम आकार की स्ट्रीम (100 एमबी तक) के लिए और जब कोड की पठनीयता माइक्रो-ऑप्टिमाइज़ेशन से अधिक महत्वपूर्ण हो।
\n\n2. एसिंक्रोनस हीरो: ReadAsync और Buffer
\n\nआधुनिक विकास में, एसिंक्रोनसिटी एक मानक है। ReadAsync विधि आपको थ्रेड को ब्लॉक किए बिना डेटा को भागों में पढ़ने की अनुमति देती है। यह विशेष रूप से ASP.NET Core या GUI एप्लिकेशन में उपयोगी है।
public static async Task<byte[]> StreamToBytesAsync(Stream inputStream)\n{\n using (var memoryStream = new MemoryStream())\n {\n byte[] buffer = new byte[8192]; // 8 केबी — मानक आकार\n int bytesRead;\n while ((bytesRead = await inputStream.ReadAsync(buffer, 0, buffer.Length)) > 0)\n {\n await memoryStream.WriteAsync(buffer, 0, bytesRead);\n }\n return memoryStream.ToArray();\n }\n}\n\nपेशेवर सलाह: बफर का आकार बदला जा सकता है। नेटवर्क स्ट्रीम के लिए 8 केबी सबसे अच्छा है। SSD डिस्क के लिए इसे 64 केबी तक बढ़ाया जा सकता है।
\n\nलाभ:
\n- \n
- कॉल करने वाले थ्रेड को ब्लॉक नहीं करता। \n
- डेटा को "फ्लाई पर" प्रोसेस करने की अनुमति देता है (जैसे, हैश की गणना)। \n
- मेमोरी उपयोग पर नियंत्रण। \n
नुकसान:
\n- \n
- थोड़ा अधिक कोड। \n
- async/await पैटर्न की समझ की आवश्यकता है। \n
3. BinaryReader: पुराना दोस्त नए दोस्तों से बेहतर
\n\nकई लोग BinaryReader को भूल जाते हैं, लेकिन यह गलती है। यह एक कमांड — ReadBytes से पूरी स्ट्रीम पढ़ सकता है। लेकिन एक बात है: इसे स्ट्रीम की लंबाई पहले से पता होनी चाहिए।
public static byte[] StreamToBytesUsingBinaryReader(Stream inputStream)\n{\n if (inputStream.CanSeek)\n {\n inputStream.Position = 0; // यदि आवश्यक हो तो स्थिति रीसेट करें\n using (var reader = new BinaryReader(inputStream, Encoding.UTF8, leaveOpen: true))\n {\n return reader.ReadBytes((int)inputStream.Length);\n }\n }\n else\n {\n throw new InvalidOperationException("स्ट्रीम सीकिंग का समर्थन नहीं करती");\n }\n}