۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه استفاده از BufferedStream و MemoryStream در سی شارپ

برای خواندن و نوشتن سریع‌تر داده‌ها در برنامه‌های NET خود، از کلاس‌های استریم در NET 7 استفاده کنید.

برای خواندن و نوشتن سریع‌تر داده‌ها در برنامه‌های NET خود، از کلاس‌های استریم در NET 7 استفاده کنید.

جریان یک انتزاع بر روی یک دنباله از بایت است. شما می توانید آن را به عنوان یک بافر پیوسته در نظر بگیرید که می توان آن را خواند یا نوشت. جریان ها اغلب به همراه بافرها استفاده می شوند تا به بارگذاری داده ها در حافظه به طور موثرتر کمک کنند. فضای نام System.IO در NET دارای کلاس‌های زیادی است که با جریان‌ها کار می‌کنند، مانند کلاس‌های FileStream، MemoryStream، FileInfo، و StreamReader/Writer.

اساساً، جریان‌ها به‌عنوان جریان‌های بایت یا جریان کاراکتر طبقه‌بندی می‌شوند، که در آن جریان‌های بایت با داده‌هایی که به صورت بایت نشان داده می‌شوند و جریان‌های کاراکتر با کاراکترها سروکار دارند. در دات نت، جریان های بایت شامل کلاس های Stream، FileStream، MemoryStream و BufferedStream هستند. جریان‌های کاراکتر دات‌نت شامل TextReader، TextWriter، StreamReader و StreamWriter است.

این مقاله استفاده از کلاس‌های BufferedStream و MemoryStream در C# را با نمونه‌های کد مربوطه در هر کجا که قابل اجرا باشد، نشان می‌دهد. برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخه‌ای ندارید، می‌توانید Visual Studio 2022 را از اینجا بارگیری کنید.

یک پروژه برنامه کاربردی کنسول در ویژوال استودیو ایجاد کنید

ابتدا، اجازه دهید یک پروژه برنامه کاربردی کنسول NET Core در ویژوال استودیو ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل ذکر شده در زیر را دنبال کنید تا یک پروژه برنامه کاربردی کنسول NET Core جدید در Visual Studio ایجاد کنید.

  1. Visual Studio IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود” که در ادامه نشان داده شده است، نام و مکان پروژه جدید را مشخص کنید.
  6. بعدی را کلیک کنید.
  7. در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، «NET 7.0 (Standard Term Support)» را به عنوان نسخه چارچوبی که می خواهید استفاده کنید انتخاب کنید.
  8. روی ایجاد کلیک کنید.
آنچه توسعه دهندگان نرم افزار باید در مورد طراحی بدانند: مصاحبه با Soleio

ما از این پروژه برنامه کاربردی کنسول NET 7 برای کار با کلاس‌های BufferedStream و MemoryStream در بخش‌های بعدی این مقاله استفاده خواهیم کرد.

بافر چیست؟

یک بافر نشان دهنده بلوکی از بایت ها در حافظه است که می توانید به طور موقت داده های گذرا را ذخیره کنید. یک بافر به به حداقل رساندن تعداد تماس‌هایی که برنامه شما برای خواندن و نوشتن داده‌ها از و به سیستم فایل انجام می‌دهد، کمک می‌کند. بافرها زمانی مفید هستند که شما نیاز به ذخیره داده هایی دارید که از یک سیستم کامپیوتری به سیستم دیگر یا از یک جزء برنامه به جزء دیگر منتقل می شوند.

بافرها همراه با جریان ها استفاده می شوند تا خواندن و نوشتن داده ها را برای برنامه ها آسان تر کنند. بافرها داده ها را به طور موقت ذخیره می کنند تا برنامه شما نیازی به خواندن مجدد داده ها از دیسک هر بار که درخواست می شود نداشته باشد.

از کلاس BufferedStream در C# استفاده کنید

کلاس BufferedStream نوعی جریان را نشان می دهد که می تواند داده ها را قبل از نوشتن در جریان بافر کند. به عبارت دیگر، یک جریان بافر می‌تواند داده‌ها را در بافر بخواند یا بنویسد، به شما این امکان را می‌دهد که تکه‌های بزرگ‌تری از داده‌ها را به یکباره بخوانید یا بنویسید تا عملکرد را بهبود ببخشید. می‌توانید جریان‌های بافری را از جریان‌های حافظه و جریان‌های فایل ایجاد کنید.

وقتی نمونه ای از کلاس BufferedStream ایجاد می کنید، می توانید اندازه بافر را نیز مشخص کنید. اندازه بافر پیش فرض ۴۰۹۶ بایت است. خواندن داده‌ها از یک جریان بافر شامل خواندن از بافر هنگام فراخوانی متد Read می‌شود. حتی اگر چندین بار با Read تماس بگیرید، داده‌ها فقط یک بار از جریان دریافت می‌شوند.

مایکروسافت از زبان TypeSpec برای توسعه API رونمایی کرد

هنگامی که در یک جریان بافر می‌نویسید، داده‌ها در یک بافر نوشته می‌شوند و وقتی متد Flush را فراخوانی می‌کنید در جریان قرار می‌گیرند. این کار را با اجتناب از دسترسی به جریان برای هر تماس Write بهبود می بخشد. وقتی از بافر استفاده می کنیم، تا زمانی که تعداد معینی از عملیات درخواست نشده باشد، نوشتن یا خواندن را اجرا نمی کنیم.

BufferedStream با ذخیره مقداری داده در بافر داخلی خود، می‌تواند چندین عملیات را در یک تکه حافظه بدون نیاز به تخصیص مجدد حافظه پردازش کند. این باعث صرفه جویی در زمان و مصرف حافظه در هنگام ایجاد مکرر اشیاء جدید می شود.

توجه داشته باشید که می‌توانید از یک نمونه BufferedStream برای خواندن داده یا نوشتن داده استفاده کنید، اما نمی‌توانید از یک نمونه برای هر دو عملیات استفاده کنید. BufferedStream برای جلوگیری از کند شدن سرعت ورودی و خروجی در زمانی که نیازی به بافر نیست طراحی شده است. اگر اندازه خواندن و نوشتن همیشه از اندازه بافر داخلی بیشتر باشد، یک جریان بافر حتی ممکن است یک بافر داخلی اختصاص ندهد.

قطعه کد زیر نشان می دهد که چگونه می توانید داده ها را با استفاده از BufferedStream در یک فایل بنویسید.

 
using (FileStream fileStream = new FileStream("D:\\MyTextFile.txt", FileMode.Create, FileAccess.ReadWrite))
{
      BufferedStream bufferedStream = new BufferedStream(fileStream, 1024);
      byte[] bytes = Encoding.ASCII.GetBytes("This is a sample text.");
      bufferedStream.Write(bytes);
      bufferedStream.Flush();
      bufferedStream.Close();
}

چه زمانی باید از BufferedStream استفاده کنید؟ زمانی که می‌خواهید پشتیبانی از بافر را به یک جریان موجود اضافه کنید، از BufferedStream استفاده کنید. بنابراین اگر جریان اصلی یک جریان شبکه بود، داده‌های ارسال شده به آن قبل از اینکه در جریان شبکه نوشته شوند یا از آن بازیابی شوند، در یک بافر کوچک ذخیره می‌شوند.

استفاده از کلاس MemoryStream در C#

کلاس MemoryStream یک جریان سبک وزن را نشان می دهد که به شما امکان می دهد در بافر حافظه بنویسید یا از آن بخوانید. کلاس MemoryStream از همان روش ها و ویژگی های کلاس Stream پشتیبانی می کند. MemoryStream یک راه ساده برای خواندن یا نوشتن داده ها به طور مستقیم از حافظه فراهم می کند، بدون اینکه هر بار که می خواهید چیزی را بخوانید یا بنویسید، نیازی به تخصیص و تخصیص حافظه داشته باشید. این باعث می‌شود سریع‌تر از استفاده از تکنیک‌های دیگر که نیاز به تخصیص مجدد حافظه در هر بار استفاده دارند.

پلتفرم توسعه دهنده داخلی چیست؟ PaaS راه شما را انجام داد

جریان حافظه جریانی است که بسیار سریع و کارآمد است زیرا داده ها در حافظه هستند. با این حال، این بدان معناست که اگر برنامه از کار بیفتد یا رایانه به طور ناگهانی خاموش شود، به راحتی می توان آن را از دست داد.

کلاس MemoryStream بخشی از فضای نام System.IO است. می توان از آن برای خواندن و نوشتن روی فایل ها، اتصالات شبکه و سایر دستگاه هایی که از خواندن و نوشتن داده پشتیبانی می کنند استفاده کرد. کلاس MemoryStream همچنین می تواند برای سریال سازی یک شی در جریانی از بایت ها برای ذخیره سازی یا انتقال از طریق اتصال شبکه استفاده شود.

قطعه کد زیر نشان می دهد که چگونه می توانید داده ها را در یک جریان حافظه در C# بنویسید.

 
byte[] bytes = System.Text.Encoding.ASCII.GetBytes("This is a sample text.");
using (MemoryStream memoryStream = new MemoryStream(50))
{
     memoryStream.Write(bytes, 0, bytes.Length);
}

چه زمانی باید از MemoryStream استفاده کنید؟ همانطور که از نام آن پیداست، MemoryStream یک جریان فقط حافظه است. به این ترتیب، تنها زمانی باید از آن استفاده کرد که مقدار داده‌ای که باید در حافظه پنهان ذخیره شود به اندازه کافی کم باشد که به راحتی در حافظه جا شود.

در حالی که BufferedStream سریعتر و کارآمدتر است، MemoryStream برای سناریوهایی که برنامه شما نیاز به دسترسی سریعتر به داده ها دارد، مناسب است. می‌توانید از نسخه‌های همگام روش‌های خواندن و نوشتن کلاس‌های BufferedStream و MemoryStream برای عملکرد و مقیاس‌پذیری بهتر استفاده کنید.