.NET Framework’te diğer başka platformlarda olduğu gibi I/O sistemi, akımlar üzerine kuruULdur. Akım(stream), byte düzeyinde bir girdi bilgisi oULşturan veya çıktı bilgisi elde eden mantıksal birimlerdir. Bu birimler I/O sistemi aracılığıyla dosya, network, ekran gibi fiziksel aygıta bağlanır. Örneğin disk üzerinde bilgi okuma/yazma, klavyeden bilgi alma ve ekrana bilgi yazdırma gibi işlemler için akım yöntemi kullanılır. Bilindiği gibi bu ortamlar, okuma veya yazma bakımından bellek kadar hızlı ve kullanışlı değildir. Bu yüzden bu ortamlara okuma/yazma işlemleri bir kere de değil parça parça(byte byte) işlenir. Örneğin internet’ten izlenilecek videoyu makinemiz bir kerede almaya hazır olmayabilir veya network alt yapısı bunu karşılamıyor olabilir. İşte bu tür durumlarda stream kavramı bir çözüm olarak ortaya çıkmıştır.
.NET Framework’te programların kullanımına sunulmuş üç standart akım buULnmaktadır;
Konsol uygulamalarında kullandığımız Console.WriteLine() ve Console.ReadLine() metodları, Console.Out() ve Console.In() metodlarına aracılık eder.
.NET Framework’te uygulama geliştiren bir programcı için akımların byte tabanlı olması sorun teşkil etmez. Çünkü .NET Framework, byte akımı ve karakter akımı arasında dönüştürme işlemlerini otomatik yapan çeşitli sınıflar sunar. Yukarıda verilen standart akımlar, karakter akımlarıdır yani karakterleri okur ve yazarlar.
.NET Framework’te hem byte hem de karakter akımı sınıflar mevcuttur. Karakter akımı sınıflar temelde byte akımı sınıfları kullanır. Akım sınıflarının temelini soyut bir sınıf olan System.IO.Stream sınıfı oULşturur. Bu sınıfın temel metodları şunlardır;
Close() : Akımı kapatarak kaynakları serbest bırakır.
FULsh() : 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.
Byte ve Karakter Akım Sınıfları
Stream sınıfından türemiş üç tür byte akım sınıfı buULnur.
Bu sınıflar, doğrudan System.IO.Stream sınıfından türemiş ve Stream sınıfının tüm özelliklerini taşırlar.
Karakter akımı için aşağıdaki sınıflar kullanılır:
Bu sınıflar, karakter akımın temelini oULşturan TextWriter ve TextReader sınıflarından türemiştir. TextReader, girdiyi, TextWriter ise çıktıyı elde eder. Aşağıdaki şekilde TextReader sınıfının metodları gösterilmiştir.
Close(): Akımı oluşturan girdi kaynağını kapatır.
Peek(): Girdi akımından bir karakter okur fakat karakteri girdiden çıkarmaz. Eğer okunacak karakter mevcut değilse -1 döndürür.
Read(): Akımdan bir karakterlik okuma yapar ve okuduğu karakterin tamsayı gösterimini döndürür. Akımında okunacak karakter kalmazsa -1 döndürür.
ReadBlock(): Akımdan count parametresi kadar karakter okuyup buffer parametresindeki diziye index parametresindeki değerden itibaren yazar.
ReadLine(): Akımdaki bir sonraki metin satırını okur ve bunu string olarak döndürür. Eğer okunacak satır bulunmazsa geriye null Nothing döndürür.
ReadToEnd(): Akımdaki geri kalan tüm karakterleri okur ve bunları string olarak döndürür. Okunacak veri olmazsa geriye boş değer döndürür.
TextWriter sınıfı, daha az metod içerir.
Close(): Akımı kapatır.
Flush(): Çıktı tamponundaki verileri fiziksel ortama yazdırır.
Write(): Aşırı yüklenmiş olup, çıktıya aynı satırda parametre olarak aldığı değeri yazar. Değerin sonuna herhangi bir satır sonlandırıcı eklemez.
WriteLine(): Aşırı yüklenmiş olup, çıktıya yeni bir satırda parametre olarak aldığı değeri yazar.
.NET Framework, byte ve karakter akımlarına ek olarak ikili akım sınıfları sunar. İkili(binary) verileri okumak için oluşturulmuş olan bu sınıflar, BinaryReader ve BinaryWriter sınıflarıdır.
< ı>BinaryReader, < ı>BinaryWriter, StreamRader ve < ı>StreamWriter sınıflarının yapıcı metodları genellikle FileStream türünde parametre alır.
Anlattıklarımızı bir cümleyle özetleyelim. Metin tabanlı dosyalar üzerinde okuma/yazma işlemi için TextReader ve TextWriter sınıfları, ikili dosyalar için BinaryReader ve BinaryWriter sınıfları kullanılır. Ayrıca her iki dosya türü üzerinde çalışmak için FileStream sınıfı kullanılabilir. Umarım başka bir yazıda bu sınıfları detaylandırma imkanımız olur.