C# ile Stream Programlama, dosya okuma ve yazma işlemlerinde size yol gösterir Stream sınıfı kullanımı ile veri akışını istediğiniz şekilde yönetin Hemen kitabı satın alın ve Stream Programlama'da uzmanlaşın!
C# programlama dili ile veri akışı konusunda birçok işlem yapılabilmektedir. Bu işlemler arasında veri okuma ve yazma, dosya ve ağ işlemleri yer almaktadır. Bu işlemler Stream sınıfı ile gerçekleştirilebilmektedir. Stream sınıfı, veri akışı işlemleri için kullanılan bir sınıftır. Bu sınıf ile birlikte bellek, dosya ve ağ gibi farklı Stream türleri kullanılabilmektedir.
Stream sınıfları ile birlikte kullanılan StreamReader, StreamWriter, BinaryReader ve BinaryWriter gibi işlemler ile de farklı veri türleri üzerinde işlemler yapılabilmektedir. Ayrıca, MemoryStream sınıfı ile bellekteki veriler üzerinde, FileStream sınıfı ile dosya üzerinde ve NetworkStream sınıfı ile ağ üzerinde işlemler gerçekleştirilebilmektedir. Bu sınıfların kullanım alanları ve işlemler hakkında detaylı bilgi sahibi olunması, veri akışı konusunda başarılı işlemler yapılmasında büyük önem taşımaktadır.
Stream Nedir?
Stream, C# programlama dili ile veri okuma ve yazma işlemleri yapmak için kullanılan bir sınıftır. Stream sınıfı, verilerin birbirlerine bağlı olmalarını sağlayarak sıralı bir şekilde işlenmelerini sağlar. Bu sayede verilerin istenilen hedefe ulaştırılması kolaylaşır.
Stream, genel olarak bellek, dosya ve ağ veri kaynaklarından gelen verileri okur ve yazma işlemlerini gerçekleştirir. Veri işleme sürecinde kullanılan stream sınıfları, okuma ve yazma işlemlerinde standart yöntemler sağlayarak, yazılım geliştiricilerinin işlemlerini kolaylaştırır. Bu sayede daha verimli bir kod yazımı gerçekleştirilir.
Stream kullanarak işlem yapmak isteyen yazılım geliştiricileri, verilerin başından sonuna kadar her bir karakteri dahi okuyabilecekleri gibi, dosya boyutunun çok büyük olması durumunda bile bu işlemi rahatlıkla gerçekleştirebileceklerdir. Stream sınıfı ile birlikte kullanılabilen diğer sınıflar da bu konudaki işlemleri kolaylaştıran özelliklere sahiptirler.
Stream Türleri
C# programlama dilinde veri akışı işlemleri için kullanılan Stream sınıfı farklı türleriyle birlikte çok yönlü bir kullanım sağlar. MemoryStream, FileStream ve NetworkStream Stream türleri en sık kullanılanlardır.
MemoryStream sınıfı, bellekteki verileri işlemek için kullanılırken FileStream sınıfı ise dosya okuma ve yazma işlemleri için idealdir. NetworkStream sınıfı ise ağ işlemlerinde kullanılmaktadır.
MemoryStream sınıfı bellekteki veriler için kullanıldığından küçük boyutlardaki veriler için oldukça hızlıdır. StreamReader ve StreamWriter işlemleriyle birlikte kullanıldığında bellek işlemlerinde oldukça yararlıdır. FileStream sınıfı daha büyük boyutlardaki dosya işlemleri için tercih edilir. Dosya okuma ve yazma işlemlerinin yanı sıra BinaryReader ve BinaryWriter sınıfları ile birlikte kullanılabilen FileStream sınıfı tüm dosya işlemlerinde idealdir. NetworkStream sınıfı ise özellikle sunucu istekleri gibi ağ işlemleri için kullanılır ve TcpClient, UdpClient, Socket gibi nesnelerin işlemlerinde oldukça yararlıdır.
- MemoryStream: Bellekteki veriler için kullanılır
- FileStream: Dosya okuma ve yazma işlemleri için kullanılır
- NetworkStream: Ağ işlemleri için kullanılır
Stream sınıfı farklı türleriyle birlikte kullanıldığında oldukça yararlı bir yapı sunar. StreamReader ve StreamWriter işlemleri ile veri okuma ve yazma işlemleri gerçekleştirilebilir. BinaryReader ve BinaryWriter sınıfları ise Binary verilerin okunması ve yazılması için kullanılır. Bu işlemler Stream sınıfları ile birlikte yapıldığında oldukça güçlü bir veri akışı yapısı oluşur.
MemoryStream
MemoryStream sınıfı, bellekteki verilerin okuma ve yazma işlemleri için kullanılan bir sınıftır. Bu sınıfın kullanımı oldukça kolaydır ve bellekte tutulan verilerin hafıza maliyeti oldukça düşüktür. MemoryStream sınıfıyla gelen bazı özellikler şu şekildedir:
- Verilerin bellekte tutulması.
- Belirli bir aralıktaki baytların okunması.
- Belirli bir aralıktaki baytların yazılması.
MemoryStream sınıfı, BinaryReader ve BinaryWriter gibi sınıflarla birlikte kullanılarak daha etkili bir çözüm oluşturabilir. Ayrıca, MemoryStream sınıfı FileStream sınıfıyla da kullanılabilir, ancak FileStream sınıfı diske veri yazma ve diske veri okuma amacıyla kullanılırken MemoryStream sınıfı bellekteki veriler için kullanılır.
MemoryStream sınıfı, diğer Stream sınıflarına göre daha hızlı bir performans sunar çünkü bellekteki verilerin işlenmesi daha hızlıdır. Örneğin, bir dosyadan veri okuma işlemi yapıldığında, bu işlem uzun sürebilir çünkü veriler diske yazılmıştır ve diske erişme işlemi yavaş olabilir. Ancak, MemoryStream sınıfı ile bellekteki veriler okunacağı için bu işlem çok daha hızlı olacaktır.
Metod | Açıklama |
---|---|
Write(byte[] buffer, int offset, int count) | Belleğe veri yazma. |
WriteByte(byte value) | Belirtilen baytı belleğe yazar. |
Read(byte[] buffer, int offset, int count) | Bellekten veri okuma. |
Flush() | Bellekteki verileri saklama. |
MemoryStream sınıfı kullanılırken dikkat edilmesi gereken bazı noktalar bulunmaktadır. Öncelikle, MemoryStream sınıfını kullanırken bellekte tuttuğumuz verilerin boyutunu dikkatli bir şekilde kontrol etmeliyiz. İkincisi, kodumuzda bellek sızıntısı olmaması için MemoryStream nesnesini kullandıktan sonra hemen Dispose() metoduyla bellekten kaldırılmalıdır. Bu işlemlerin dışında, MemoryStream sınıfı oldukça kullanışlı ve hızlı bir sınıftır ve veri akışını yönetmek için C# programlama dilinde önemli bir rol oynamaktadır.
Okuma ve Yazma
MemoryStream sınıfı ile veri okuma ve yazma işlemleri oldukça kolay bir şekilde yapılabilir. İlk olarak, yazmak istediğimiz veriyi bir byte dizisi şeklinde yazarak MemoryStream nesnesi oluşturuyoruz. Örneğin:
byte[] veri = Encoding.UTF8.GetBytes("Merhaba Dünya!"); |
---|
MemoryStream stream = new MemoryStream(veri); |
Bu kodlarla birlikte "Merhaba Dünya!" yazısını içeren bir MemoryStream nesnesi oluşturmuş olduk. Daha sonra, oluşturduğumuz MemoryStream nesnesini okuma veya yazma işlemleri için kullanabiliriz. Örneğin:
string metin; |
---|
byte[] okunanVeri = new byte[veri.Length]; |
stream.Read(okunanVeri, 0, (int)stream.Length); |
metin = Encoding.UTF8.GetString(okunanVeri); |
Bu kodlarla birlikte oluşturduğumuz MemoryStream nesnesi içerisindeki veriyi metin değişkenine okuduk. Benzer şekilde, MemoryStream içerisine veri yazmak için de Write() metodu kullanılabilir. Örneğin:
string yeniMetin = "Yeni bir metin"; |
---|
byte[] yazilanVeri = Encoding.UTF8.GetBytes(yeniMetin); |
stream.Write(yazilanVeri, 0, yazilanVeri.Length); |
Bu kodlarla birlikte MemoryStream nesnesi içerisine "Yeni bir metin" yazısını yazdık. Özetle, MemoryStream sınıfı yardımıyla veri okuma ve yazma işlemleri oldukça kolay bir şekilde gerçekleştirilebilir.
Kapama ve Temizleme
MemoryStream sınıfını kullanırken kapatma ve temizleme işlemlerine dikkat etmek gerekiyor. Dosyaların açık kalmaması, gereksiz bellek kullanımının önlenmesi ve veri kaybı olmaması için işlemlerin doğru bir şekilde tamamlanması önemlidir. Bu işlemler genellikle using blokları ile gerçekleştirilir. Using blokları, MemoryStream nesnesi içindeki işlemlerin tamamlandığından ve bellek kaynaklarının serbest bırakıldığından emin olmak için kullanılır.
Bunun yanı sıra MemoryStream sınıfı ile ilişkili Close ve Dispose() yöntemleri ile de MemoryStream nesnesinin kapatılması ve bellek kaynaklarının serbest bırakılması sağlanabilir. Close yöntemi, MemoryStream nesnesini kapatır ve işlemleri bitirir. Dispose() yöntemi ise nesneyi bellekten tamamen siler ve işlemleri sonlandırır. Bu yöntemlerin kullanımı, bellek kaynaklarının daha verimli kullanılmasını ve dosya kaybının önlenmesini sağlar.
FileStream
C# programlama dili veri akışı konusunda önemli bir yere sahiptir. Dosya okuma ve yazma işlemleri için ise kullanılan FileStream sınıfı oldukça işlevseldir. Bu sınıf sayesinde dosyalardaki veriler okunabilir ve yazılabilir.
FileStream sınıfı ile dosya okuma işlemi gerçekleştirilirken, öncelikle bir dosya açılmalıdır. Bu işlem için File sınıfının Open metodu kullanılabilir. Diğer bir seçenek ise FileStream sınıfı ile bir FileStream açmaktır. FileStream nesnesi, okuma yapılacak dosya adı ve işlem modunu parametre olarak alır.
İşlem Modu | Açıklama |
---|---|
FileMode.Append | Dosyanın sonuna ekleme yapar. |
FileMode.Create | Dosyayı oluşturur. |
FileMode.CreateNew | Yeni bir dosya oluşturur. Dosya zaten varsa hata fırlatır. |
FileMode.Open | Dosyayı açar. |
FileMode.OpenOrCreate | Dosyayı açar ya da varsa oluşturur. |
FileMode.Truncate | Dosyanın boyutunu sıfırlar. |
Bir dosya açıldıktan sonra, FileStream nesnesi ve bir byte dizisi kullanılarak dosyadaki veriler okunabilir. Bu işlem, FileStream nesnesinin Read metodu ile gerçekleştirilir. Okuma işlemi sonlandıktan sonra kullanılan tüm kaynaklar serbest bırakılmalıdır. Bunun için FileStream nesnesinin Close ya da Dispose metotları kullanılabilir.
FileStream sınıfı aynı zamanda veri yazma işlemleri için de kullanılabilir. Bunun için öncelikle bir dosya oluşturmak ya da açmak gerekir. Dosyadaki verileri değiştirme işlemi FileStream sınıfının Write metodu ile yapılabilir. Dosyayı yazarken, önceden açılmış bir FileStream nesnesi veya File sınıfının OpenWrite metodu kullanılabilir. Verileri yazdıktan sonra, kaynaklar kapatılmalıdır. Bu işlem için FileStream nesnesinin Close ya da Dispose metotları kullanılabilir.
Dosya Okuma
Dosya okuma işlemleri için FileStream sınıfı oldukça kullanışlıdır. Bu işlemi yaparken dikkat edilmesi gereken bazı noktalar bulunmaktadır. İlk olarak, okuma işlemi yapılacak dosyanın ne zaman kapatılacağına karar verilmelidir. Dosya okuma işlemi tamamlandıktan sonra FileStream nesnesi otomatik olarak kapatılmayacaktır, bu nedenle FileStream.Dispose () yöntemi kullanılarak dosya kapatılmalıdır.
Ayrıca, dosya verilerinin kaç bayt okunacağının bilinmesi gerekmektedir. Dosya boyutunun tamamını okuma veya yalnızca belirli bir kısmını okuma seçeneği vardır. Dosyanın boyutunu önceden bilmiyorsanız, dosyayı okumak için FileStream.Length özelliği kullanılabilir.
Dosya okuma işlemi yaparken, dosyanın güvenli bir şekilde kapatılmadığından dolayı bazı sorunlarla karşılaşabilirsiniz. Bu nedenle, dosyayı açmadan önce FileStream.Lock () yöntemi çağrılmalıdır. Bu işlem, dosyanın bir başka işlem tarafından kilitlenmesini önler ve FileStream.Dispose () yöntemi çağrıldığında dosya otomatik olarak kapatılır.
Dosya okuma işlemi yaparken, read (), readByte () veya readLines () yöntemleri ile dosyadaki veriler okunacaktır. Okuma işlemi ayrıca, dosyadaki verilerin belirli bir konumundan başlatılabilecektir. Bu işlem için ise, read (), readByte () veya readLines () yöntemleri kullanılarak dosya konumu ayarlanmalıdır.
Bu önemli noktalar dikkate alınarak, FileStream sınıfı kullanılarak dosya okuma işlemleri oldukça kolay ve güvenli bir şekilde gerçekleştirilebilir.
Dosya Yazma
FileStream sınıfı, dosyaya veri yazmak için de kullanılabilir. Dosyaya yazmak için StreamWriter sınıfı kullanılır. Ancak FileStream sınıfı, StreamWriter sınıfından daha hızlı bir şekilde dosyaya veri yazmaya olanak sağlar.
Dosyaya yazmak için ilk olarak FileStream sınıfından bir nesne oluşturulmalıdır. Oluşturulan nesnede FileMode belirtilerek dosya açılır. Dosya açma işlemi FileMode.CreateNew, FileMode.Create, FileMode.OpenOrCreate, FileMode.Open ve FileMode.Truncate ile yapılabilir.
Bir dosyaya veri yazmak için StreamWriter sınıfı kullanılır. Dosya açıldıktan sonra StreamWriter nesnesi oluşturulur ve Write veya WriteLine metodları ile veri dosyaya yazılır. Şu örnekte "deneme.txt" adlı dosyaya "Merhaba Dünya!" yazılmıştır.
Kod Örneği |
---|
using (FileStream fs = new FileStream("deneme.txt", FileMode.Create)) { using (StreamWriter sw = new StreamWriter(fs)) { sw.Write("Merhaba Dünya!"); } } |
Dosyaya yazma işlemi tamamlandıktan sonra FileStream ve StreamWriter nesnelerinin kapatılması gereklidir. Çünkü dosyanın kapatılmaması durumunda dosya hala işlem görür ve başka bir işlem için kullanılamaz. Bu nedenle nesnelerin kullanımı bittiği anda Dispose metodları kullanılarak kapatılmalıdır.
Dosya yazma işleminde, bir önceki işlemde olduğu gibi karşılaşılan hataları yakalamak ve uygun şekilde işlem yapmak gereklidir. Dosya yazarken üzerine yazarak verilerin kaybı gibi durumlar yaşanabilir. Bu nedenle, dosya açma yöntemi belirlenirken FileMode belirlemesi dikkatli bir şekilde yapılmalıdır.
NetworkStream
Ağ işlemleri yapmak için kullanılan bir sınıf olan NetworkStream, veri transferi işlemlerinde kullanılır. Bu sınıf, ana sunucu veya istemcide veri paketleri oluşturur ve diğer sunucular veya istemciler arasında aktarır. NetworkStream sınıfı, ağ üzerinde senkronize veri okuma ve yazma işlemleri yapmanıza olanak tanır. Bu sayede, ağ üzerindeki verileri hızlı bir şekilde yönetebilirsiniz.
NetworkStream sınıfı, dosya akışı ve bellek akışı gibi farklı akış türlerine benzer bir şekilde çalışır. Ancak, bu sınıf ağ üzerindeki verilerin akışını yönetir. Server ve client yani istemci programları arasında veri transferi yapmak için kullanılabilir. Veri akması için NetworkStream sınıfı kullanan bir client, bir sunucuya bağlanabilir ve sunucu üzerindeki verilere erişim sağlayabilir. Aynı şekilde, server da client üzerindeki verilere erişebilir ve istenirse NetworkStream sınıfını kullanarak, veriler değiştirilebilir.
Metot İsmi | Açıklama |
---|---|
Close | NetworkStream sınıfını kapatır ve kapatma işlemini gerçekleştirir. |
BeginRead | Ağ üzerinden asenkron veri okuma işlemini başlatır. |
BeginWrite | Ağ üzerinde asenkron veri yazma işlemini başlatır. |
Read | Ağ üzerinden senkron veri okuma işlemini gerçekleştirir. |
Write | Ağ üzerinde senkron veri yazma işlemini gerçekleştirir. |
NetworkStream sınıfı hakkında detaylı bilgi edindikten sonra artık uygulamalarınızda bu sınıftan faydalanabilirsiniz. Network üzerinden veri aktarımı gerçekleştireceğiniz uygulamalarınızda NetworkStream sınıfını kullanarak, veri transfer işlemlerinizi kolayca yönetebilirsiniz.
Stream İşlemleri
Stream sınıfları, veri işlemelerini kolaylaştıran sınıflardan biridir. Stream sınıfları ile birlikte kullanılan işlemler, temel olarak verilerin okunması ve yazılmasını içerir. Bu işlemler sırasında StreamReader ve StreamWriter sınıfları kullanılarak veriler daha kolay ve hızlı bir şekilde işlenebilir.
Ayrıca, BinaryReader ve BinaryWriter sınıfları da kullanıcıların binary verilerinin okunması ve yazılması için bir seçenek sunar. Binary veriler, verilerin daha hızlı işlenmesini sağlar ve bu işlemler sırasında BinaryReader ve BinaryWriter sınıflarıyla kolayca çözümlenebilir.
Stream sınıfları ayrıca, verilerin belirli bir konumdan okunmasına izin veren Position özelliğine sahiptir. Bu özellik, verilerin okunmasını veya yazılmasını daha spesifik bir şekilde kontrol etmek isteyen kullanıcılara özelleştirilmiş bir yaklaşım sunar.
Sonuç olarak, Stream sınıfları, veri işlemelerinin açık bir şekilde gerçekleştirilmesini sağlayan çok yönlü sınıflardan biridir. StreamReader ve StreamWriter işlemleri, verileri okumak ve yazmak için kullanılan temel işlemlerdir. BinaryReader ve BinaryWriter işlemleri ise daha hızlı ve kolay bir şekilde binary verilerin okunmasını ve yazılmasını sağlar. Bu işlemler sırasında, Stream nesnelerinin Position özelliği de belirli bir konumda veri işlemlerini yürütmek için kullanılabilir.
StreamReader ve StreamWriter
StreamReader ve StreamWriter, Stream nesneleri ile birlikte kullanılan işlemlerdir. StreamReader, Stream nesnesi üzerinde veri okuma işlemini gerçekleştirirken, StreamWriter ise veri yazma işlemini gerçekleştirir. StreamReader kullanarak metin dosyalarının içeriğini okuyabilir ve StreamWriter kullanarak da yeni metin dosyaları oluşturabilirsiniz.
StreamReader ve StreamWriter işlemleri birbirine çok benzer. Her iki işlem de önce bir Stream nesnesi oluşturulur. Daha sonra, StreamReader veya StreamWriter nesnesi oluşturulur ve Stream nesnesi ile birlikte kullanılır. Bu işlemler sırasında, dosya veya Stream nesnesi ile ilgili hataların kontrolü için try-catch blokları kullanılmalıdır.
Aşağıda StreamReader ve StreamWriter kullanarak bir metin dosyasının içindeki verileri okuyarak yeni bir metin dosyası oluşturma örneği verilmiştir:
StreamReader Kullanımı | StreamWriter Kullanımı |
---|---|
|
|
Bu örnekte, StreamReader sınıfı kullanılarak "okunacakdosya.txt" isimli metin dosyasındaki veriler okunur ve ekrana yazdırılır. StreamWriter sınıfı kullanılarak yeni bir metin dosyası oluşturulur ve içine yeni satırlar yazılır.
StreamReader ve StreamWriter işlemleri sayesinde, C# programlama dilinde veri okuma ve yazma işlemleri Stream nesneleri ile birlikte kolayca gerçekleştirilebilir. Bu sayede, dosya ve Stream nesnelerinin işlemleri daha güvenli ve daha hızlı bir şekilde gerçekleştirilir.
BinaryReader ve BinaryWriter
BinaryReader ve BinaryWriter sınıfları, binary verilerin okunması ve yazılması için kullanılan Stream sınıflarıdır. BinaryReader, Stream sınıfının okuma özelliğiyle birleştirilerek binary verileri okumak için kullanılır. BinaryWriter ise, Stream sınıfının yazma işleminin yanı sıra binary verilerin yazılması için kullanılan sınıftır. Bu sınıfların kullanımı oldukça kolaydır ve efektif sonuçlar verir.
BinaryReader sınıfı, bir akışın binary olarak okunmasına olanak sağlar. Özellikle büyük veri dosyalarının okunması için tercih edilir. BinaryWriter sınıfı ise, binary verilerin yazılması için kullanılan bir sınıftır. StreamWriter sınıfının binary verilerle çalışmak için uygun bir sınıf olmadığını belirtebiliriz. Bu nedenle, BinaryWriter kullanarak binary verilerin yazılması daha verimli sonuçlar verebilir.
Her iki sınıfın kullanımında da FileMode, FileAccess ve FileShare şeklinde parametreler belirtilir. FileMode, dosyanın nasıl açılacağını belirtirken, FileAccess dosya üzerindeki hangi izinlerin alınacağını belirtir. FileShare parametresi ise, başka processlerin dosyayı kullanmasına izin verip vermeyeceğimizi belirtir. Bu parametrelerin doğru ayarlanması, okuma ve yazma işlemlerinin başarıyla gerçekleştirilmesini sağlayacaktır.
Bir text dosyasındaki sayısal verileri okuyarak toplamını hesaplamak için BinaryReader kullanabiliriz. Aşağıdaki örnek kod, BinaryReader sınıfının StreamReader'a göre daha hızlı olduğunu gösteriyor:
StreamReader | BinaryReader |
---|---|
using (StreamReader sr = new StreamReader("numbers.txt")) { int sum = 0; int current; while ((current = sr.Read()) != -1) { if (Char.IsDigit((char)current)) { sum += int.Parse(((char)current).ToString()); } } Console.WriteLine("Sum: " + sum); } | using (BinaryReader br = new BinaryReader(File.Open("numbers.txt", FileMode.Open))) { int sum = 0; while (br.PeekChar() > -1) { int current = br.ReadInt32(); if (current > 0) { sum += current; } } Console.WriteLine("Sum: " + sum); } |
BinaryWriter kullanarak bir dosyaya binary veriler yazmak için ise aşağıdaki örnek kodları kullanabiliriz:
- BinaryWriter ile integer değer yazma:
using (BinaryWriter writer = new BinaryWriter(File.Open("data.bin", FileMode.Create))) { int value = 12345; writer.Write(value); }
- BinaryWriter ile double değer yazma:
using (BinaryWriter writer = new BinaryWriter(File.Open("data.bin", FileMode.Create))) { double value = 3.14159; writer.Write(value); }