Akış, bir bayt dizisi üzerindeki bir soyutlamadır. Bunu okunabilen veya yazılabilen sürekli bir arabellek olarak düşünebilirsiniz. Akışlar, verilerin belleğe daha verimli bir şekilde yüklenmesine yardımcı olmak için genellikle arabelleklerle birlikte kullanılır. .NET’teki System.IO ad alanı, FileStream, MemoryStream, FileInfo ve StreamReader/Writer sınıfları gibi akışlarla çalışan birçok sınıfa sahiptir.
Temel olarak akışlar, bayt akışları veya karakter akışları olarak sınıflandırılır; burada bayt akışları bayt olarak temsil edilen verilerle ve karakter akışları karakterlerle ilgilenir. .NET’te bayt akışları, Stream, FileStream, MemoryStream ve BufferedStream sınıflarını içerir. .NET karakter akışları, TextReader, TextWriter, StreamReader ve StreamWriter’ı içerir.
Bu makale, C# dilinde BufferedStream ve MemoryStream sınıflarının kullanımını ilgili kod örnekleriyle birlikte göstermektedir. Bu makalede verilen kod örnekleriyle çalışmak için sisteminizde Visual Studio 2022 kurulu olmalıdır. Halihazırda bir kopyanız yoksa, Visual Studio 2022’yi buradan indirin.
Visual Studio’da bir konsol uygulama projesi oluşturun
Öncelikle Visual Studio’da bir .NET Core konsol uygulama projesi oluşturalım. Visual Studio 2022’nin sisteminizde yüklü olduğunu varsayarak, Visual Studio’da yeni bir .NET Core konsol uygulama projesi oluşturmak için aşağıda belirtilen adımları izleyin.
- Visual Studio IDE’yi başlatın.
- “Yeni proje oluştur”u tıklayın.
- “Yeni proje oluştur” penceresinde, görüntülenen şablonlar listesinden “Konsol Uygulaması (.NET Core)” öğesini seçin.
- Sonrakine tıkla.
- Daha sonra gösterilen “Yeni projenizi yapılandırın” penceresinde, yeni proje için ad ve konumu belirtin.
- Sonrakine tıkla.
- Daha sonra gösterilen “Ek bilgiler” penceresinde, kullanmak istediğiniz Çerçeve sürümü olarak “.NET 7.0 (Standart Dönem Desteği)” öğesini seçin.
- Oluştur’a tıklayın.
Bu makalenin sonraki bölümlerinde BufferedStream ve MemoryStream sınıflarıyla çalışmak için bu .NET 7 konsol uygulama projesini kullanacağız.
tampon nedir?
Arabellek, geçici verileri geçici olarak depolayabileceğiniz bellekteki bir bayt bloğunu temsil eder. Bir arabellek, uygulamanızın dosya sisteminden veri okumak ve dosya sistemine veri yazmak için yaptığı çağrıların sayısını en aza indirmeye yardımcı olur. Arabellekler, bir bilgisayar sisteminden diğerine veya bir program bileşeninden diğerine aktarılan verileri saklamanız gerektiğinde kullanışlıdır.
Tamponlar, programların verileri verimli bir şekilde okumasını ve yazmasını kolaylaştırmak için akışlarla birlikte kullanılır. Arabellekler verileri geçici olarak depolar, böylece uygulamanız her istendiğinde verileri diskten yeniden okumaya devam etmesine gerek kalmaz.
C#’ta BufferedStream sınıfını kullanın
BufferedStream sınıfı, verileri akışa yazmadan önce arabelleğe alabilen bir akış türünü temsil eder. Başka bir deyişle, arabelleğe alınmış bir akış, verileri bir arabelleğe okuyabilir veya arabelleğe yazabilir, bu da performansı artırmak için daha büyük veri parçalarını bir kerede okumanıza veya yazmanıza olanak tanır. Bellek akışlarından ve dosya akışlarından ara belleğe alınmış akışlar oluşturabilirsiniz.
BufferedStream sınıfının bir örneğini oluşturduğunuzda arabellek boyutunu da belirleyebilirsiniz. Varsayılan arabellek boyutu 4096 bayttır. Arabelleğe alınmış bir akıştan veri okumak, Read yöntemini çağırdığınızda arabellekten okumayı içerir. Read’i birden çok kez çağırsanız bile veriler akıştan yalnızca bir kez alınır.
Arabelleğe alınmış bir akışa yazdığınızda, veriler bir arabelleğe yazılır ve ardından Flush yöntemini çağırdığınızda akışa temizlenir. Bu, her Yazma çağrısı için akışa erişimden kaçınarak performansı artırır. Bir arabellek kullandığımızda, belirli sayıda işlem talep edilene kadar yazma veya okuma gerçekleştirmeyiz.
BufferedStream, bir miktar veriyi dahili arabelleğinde depolayarak, belleği tekrar tekrar ayırmak zorunda kalmadan aynı bellek parçasında birden çok işlemi işleyebilir. Bu, art arda yeni nesneler oluştururken hem zamandan hem de bellek tüketiminden tasarruf sağlar.
Bir BufferedStream örneğini veri okumak veya yazmak için kullanabileceğinizi, ancak aynı örneği her iki işlem için kullanamayacağınızı unutmayın. BufferedStream, ara belleğe gerek olmadığında giriş ve çıkışın yavaşlamasını önlemek için tasarlanmıştır. Okuma ve yazma boyutu her zaman dahili arabellek boyutundan büyükse, arabelleğe alınmış bir akış dahili bir arabellek ayırmayabilir.
Aşağıdaki kod parçacığı, BufferedStream kullanarak bir dosyaya nasıl veri yazabileceğinizi gösterir.
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’i ne zaman kullanmalısınız? Mevcut bir akışa tamponlama desteği eklemek istediğinizde BufferedStream’i kullanın. Bu nedenle, orijinal akış bir ağ akışı olsaydı, ona gönderilen veriler ağ akışına yazılmadan veya ağ akışından alınmadan önce küçük bir arabellekte önbelleğe alınırdı.
C#’ta MemoryStream sınıfını kullanma
MemoryStream sınıfı, bir bellek arabelleğine yazmanıza veya bellekten okumanıza izin veren hafif bir akışı temsil eder. MemoryStream sınıfı, Stream sınıfıyla aynı yöntemleri ve özellikleri destekler. MemoryStream, bir şeyi her okumak veya yazmak istediğinizde belleği ayırmaya ve yeniden ayırmaya gerek kalmadan verileri doğrudan bellekten okumak veya yazmak için basit bir yol sağlar. Bu, her kullanımda belleği yeniden ayırmanızı gerektiren diğer teknikleri kullanmaktan daha hızlı hale getirir.
Bellek akışı, veriler bellekte bulunduğundan çok hızlı ve verimli olan bir akıştır. Ancak bu, program çökerse veya bilgisayar aniden kapanırsa kolayca kaybolabileceği anlamına da gelir.
MemoryStream sınıfı, System.IO ad alanının bir parçasıdır. Dosyalardan, ağ bağlantılarından ve veri okumayı ve yazmayı destekleyen diğer cihazlardan okumak ve bunlara yazmak için kullanılabilir. MemoryStream sınıfı, bir ağ bağlantısı üzerinden depolama veya iletim için bir nesneyi bir bayt akışına seri hale getirmek için de kullanılabilir.
Aşağıdaki kod parçacığı, C# dilinde bir bellek akışına nasıl veri yazabileceğinizi gösterir.
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’i ne zaman kullanmalısınız? Adından da anlaşılacağı gibi, MemoryStream yalnızca bellek akışıdır. Bu nedenle, yalnızca önbelleğe alınması gereken veri miktarı belleğe rahatça sığacak kadar küçük olduğunda kullanılmalıdır.
BufferedStream daha hızlı ve daha verimli olsa da, MemoryStream uygulamanızın verilere daha hızlı erişim gerektirdiği senaryolar için çok uygundur. Daha da iyi performans ve ölçeklenebilirlik için BufferedStream ve MemoryStream sınıflarının Read ve Write yöntemlerinin zaman uyumsuz sürümlerini kullanabilirsiniz.
Telif hakkı © 2022 IDG Communications, Inc.
Kaynak : https://www.infoworld.com/article/3681937/how-to-use-bufferedstream-and-memorystream-in-c-sharp.html#tk.rss_all