Son Haberler
Anasayfa / Yazılım / C# / Dosya Okuma ve Yazma İşlemleri – Stream (Kanal ? Akım) Kavramı

Dosya Okuma ve Yazma İşlemleri – Stream (Kanal ? Akım) Kavramı

.NET Framework ortamında dosya okuma ve yazma işlemleri için stream (akım veya diğer adı ile kanal)?den faydalanırız. Kanallar byte düzeyinde bir veri girdisi oluşturan veya çıktı bilgisi elde eden mantıksal birimlerdir.

Örneğin bir dosyadan byte düzeyinde bir veri almak için FileStram sınıfı kullanılır. StreamReader ve StreamWriter sınıfları ile de metin tabanlı bir dosyadan okuma ve yazma işlemleri yapabiliriz. Yine BinaryReader ve BinaryWriter sınıfları ile binary formatındaki dosyalar üzerinde işlemler yapabiliriz.

Kanal sınıflarının temelini System.IO.Streamsınıfı oluşturmaktadır, bu sınıfın bazı temel metotları şunlardır :

Close() : Kanalı kapatır, kaynakları serbest bırakır.
Read() : Üç adet parametresi vardır; Buffer, offset ve count. Byte sayısı kadar kanaldan okumayaparak buffera offset değerinden itibaren aktarılır.
ReadByte() : Kanaldan bir byte veri okur ve tam sayı geri döndürür, kanalın sonuna gelince -1 döndürür.
Seek() : İki parametresi vardır; offset ve origin. Kanal içindeki mevcut konumu offset değeri kadar öteler.
Flush() : Kanalın içeriğini bufferdan alıp fiziksel ortama (dosyaya vs) yazdırır.
Write() : Üç parametresi vardır; Buffer, offset ve count. Buffer offset değerinden başlanaraj count değeri kadar kanala gönderilir.
WriteByte() : Parametre olarak almış olduğu değeri kanala yazdırır.
Stream sınıfının bazı özelliklerine gelirsek :
CanWrite : Kanala yazma yapılabiliyorsa, true değerini alır.
CanRead : Kanaldan okuma yapılabiliyorsa, true değerini alır.
CanSeek : Kanal konumlandırmayı destekliyor ise true değerini alır.
Position : Kanalın o anki konumunu long tipinde verir.
Length : Kanalın uzunluğunu long tipinde verir.

Stream sınıfından türeyen üç tür Byte kanal vardır :

BufferedStream : Kanal üzerinde okuma ? yazma işleminde buffer bellek alanını kullanarak işlem yapar. Mantığı şudur, disk üzerinden okuma veya yazma yapacağı anda bunu direkt olarak diske byte byte okuyup yazmaktansa buffer üzerinde ayrılan alana veriyi öncelikle yazar veya veriyi buraya çeker buffer alanı dolunca diske yazma işlemini gerçekleştirir ya da diskten tekrar okuma yapar. (işlem ne ise ona göre yani) Böylelikle performans yüksektir.

FileStream : Dosyalar üzerinde okuma-yazma işlemleri için kullanılır.

MemoryStream : Veri depolaması için direkt olarak belleği kullanmamıza yarar.

Bu byte kanal sınıfları System.IO.Stream sınıfından türemiştir dolayısı ile tüm özelliklerini taşımaktadırlar.

Karakter Kanalı için ise aşağıdaki sınıfları kullanabiliriz. Bu sınıflar TextWriter ve TextReader sınıflarından türemiştir.

StreamReader : Byte türündeki kanaldan karakteri okur.
StreamWriter : Byte türündeki kanala karakteri yazar.
StringReader : String türündeki bir nesneden karakterleri okur.
StringWriter : String türündeki bir nesneye karakteri yazar.


TextReader sınıfının metotları :

Close() : Kanalı oluşturan kaynağı kapatır.
Read() : Kanaldan bir karakterlik okuma yapar. Okuduğu karakterin tamsayı gösterimini geri döndürür. Okunacak karakter bittiğinde -1 döner.
ReadBlock() : Üç parametresi vardır; count, buffer ve index. Kanaldan count parametresi kadar karakteri okur, buffer parametresindeki diziye index parametresinden itibaren yazar.
ReadLine () : Kanaldaki bir sonraki metin satırını okur. Bunu string olarak geri döndürür. Veri bitince geriye null döner.
ReadToEnd() : Kanaldaki geri kalan tüm karakterleri okur, geriye string döner, veri bitince null döner.
Peek() : Giriş kanalından bir karakter okur, fakat karakteri giriş kanalından çıkarmaz. Eğer okunacak veri yoksa -1 döner.

TextWriter sınıfının metotları :

Close() : Kanalı kapatır.
Write() : Yeniden yüklenmiş olup aldığı parametre içeriğini çıkışa aynı satırda yazar. Sonuna satır sonlandırıcı karakterini eklemez.
WriteLine() : Yeniden yüklenmiş olup aldığı parametre içeriğini çıkışta yeni bir satır üzerinde yazar.
Flush() : Çıktıdaki verileri fiziksel ortama yazar.

Son olarak binary veriler içinde BinaryReader ve BinaryWriter sınıfları vardır.

Bir sonraki yazılarda bunlarla alakalı örnekleri sunacağım.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir