.Net de stream işlemleri için kullanılacak namespace System.IO'dur ve bizde bugun stream'ler üzerine işlemler yaparken bu isim uzayının altında bulunan ve Stream sinifindan türeyen FileStream , MemoryStream , BufferedStream,NetworkStream siniflarina bir göz atıcaz (Bu 4 sinif .Net'de byte akım sınıfları olarak geçer) ve bunların dışında .Net'deki StreamReader , StreamWriter gibi karakter akımlarını inceleyeceğiz.
İlk saydıgım 4 sınıfın Stream sınıfından miras aldığını sölemiştim.Ben sölemiş olsamda insan duyduğuna değil gördüğüne inanırmış o yüzden bu sınıflardan herhangi birinin üzerine sağ tıklayıp "go to defination" diyerek sinifa ait member'lara ve sinifin herhangi bir sınıftan miras alıp almadığına, erişim belirleyicisinin nasıl tanımlandığına bakabiliriz ve çoğu zaman bu işimize yarar.Bunun bir üstü reflactor tarzı bi decompiler edinip sinifin kodlarınada ulaşmak ama makalenin konusu bu değil : ))

bunun dışında madem bu 4 sınıfın base class'i Stream sinifi.Bu sınıfa ait methodlara bakıp bir taşta 4 kuş vuralım : ))
View = > Object Browser

Close() : Akımı kapatarak kaynakları serbest bırakır.
Flush() : Akımın içeriğini tampon bellekten alıp fiziksel ortama yazdırır.
ReadByte() : Akımdan bir byte okur ve int olarak döndürür. Akımın sonuna gelince -1 döndürür.
Read() : Buffer(tampon), offset(öteleme) ve count(byte sayısı) olmak üzere üç parametre alır. Byte sayısı kadar byte akımdan okunarak Tampon[öteleme]‘den itibaren tampona aktarılır.
Seek() : Ofset(öteleme) ve origin(konum) olmak üzere iki parametre alır. Akım içindeki mevcut konumu, konum parametresindeki konumdan öteleme parametresindeki değer kadar ileriye öteler.
WriteByte() : Akıma parametre olarak aldığı byte’ı yazdırır.
Write() : Buffer(tampon), offset(öteleme) ve count(byte sayısı) olmak üzere üç parametre alır. Tampon[öteleme]‘den başlayarak byte sayısı kadar bilgiyi akıma yazar.
Bu metodlar dışında Stream sınıfı aşağıdaki özelliklere sahiptir;
CanRead : Akımdan okuma yapılabiliyorsa true değerini alır.
CanSeek : Akım, konumlandırmayı destekliyorsa true değerini alır.
CanWrite: Akıma yazılabiliyorsa true değerini alır.
Length : Akımın uzunULğunu long türünde verir.
Position : Akımın o anki konumunu long türünde verir.
Position özelliği hariç bu özelliklerin hepsi salt okunur niteliktedir. Position hem okunur hem de yazılır özelliktedir.
Sakın bu methodlar 4 sinifin bütün methodları gibi algılanmasın bunlar 4 sınıftada "bulunan" methodlar.
Şimdi kısaca, bu byte akım sınıfları nerelerde kullanılır buna bir bakalım ;
FileStream dosyadan okuma yazma işlemlerinde kullanılır.Mesela FileStream sinifini kullanarak,bilgisayarımızda istediğimiz bir yere kolayca bir txt dosyası yaratıp, bu dosyanın içine birşeyler yazabilir ve bu yazdığımız yazıları okuyabiliriz.Öyleyse yazmaya başlayalım ;

gördüğümüz gibi FileStream sinifinin tam 15 tane overLoad'u var.Yani kurucu method tam 15 kere aşırı yüklenmiş.Biz bu overload lardan 3.cüsünü kullanıcaz.burada bizden dosyanın oluşturulacağı path yani yol isteniyor ve bunun yanında FileMode isteniyor.

Buna ek olarak ; stream'i byte dizisi olarak yazmak için başvurabileceğimiz tek yol bu değil.Console uygulamalarında sıkça kullandığımız Console.WriteLine() ve ReadLine() sınıflarını bilirsiniz.Bu methodları Console.Out.WriteLine() ve Console.In.ReadLine() olarakta yazabiliriz.Bunu neden söylüyorum ? çünkü bu kodları yazarkende aslında console üzerine stream işlemi gerçekleştiriyoruz.Şimdi yukarda yaptığımız aynı örneği StreamWriter sinifinin WriteLine() methodu ile gerçekleştiricez.böylelikle Sylvia Plath'i byte dizisine dönüştürmek için biz bir zahmette bulunmayacağız.

burada flush ve close methodlarının ne işe yaradığı ile ilgili bir soru işareti oluşuyorsa , bu methodları "eğer okumak isterse " şeklinde command lediğim alanın üzerine koyun.birde programı o şekilde çalıştırın : )) bakalım ram üzerinde okuyacak tek bir byte dizisine ulaşabilecekmisiniz..
Kısada makalede adı geçen diğer stream lerin ne olduguna değinirsek ; BufferedStream Stream üzerindeki okuma yazma işlemini buffer kullanarak gerçekleştirir.Doğrudan disk gibi bir ortamdan veriyi okumak yerine , okunan byte lar bellek üzerindeki tampon bölgeye ( buffer) taşınır ve böylece byte okuma işlemi kaynaktan değil , buffer üzerinden olur.Tamponda okunacak veri kalmassa yeniden orjinal kaynaktan tampona okuma yapılır böylelikle daha performanslı bir yapı sağlanmış olur.
Bunların dışında MemoryStream belleği veri okuma yazma alanı olarak kullanırken, Network stream de ise soket üzerinden veri alış verişleri sağlanır.
Öyleyse birde en son MemoryStream hakkında örnek yapıp makaleyi sonlandıralım.Mesela senaryoya göre , elimizde bir byte dizisi olsun , bu byte dizisi sıkıştırıp memory ye yazalım,daha sonrada sıkıştırdığımız verileri , yeniden byte dizisi olarak geri alalım ;
