bölüm2.2: Dosya ve Streamlerde Okuma Yazma işlemleri

Okuma ve yazma işlemleri için farklı stream sınıfları kullanabilirsiniz. .net framework text ve binary dosyaları için veriyi sıkıştırmaya yada bellekte saklamaya yarayan farklı sınıflar sunmaktadır.  Bu dersimizi bitirdiğimizde;

  • text, binary ve stringler üzerinde okuma yazma işlemlerini
  • bellekteki streama yazmayı
  • dosyayaya yazıldığında onu sıkıştırmayı

incelemiş olacağız.

Text Dosyasında Okuma Yazma İşlemleri

StreamReader veya TextReader sınıflarından oluşturulacak örnekle text dosyasından okuma işlemi yapılır. Daha sonra sınfın bir metodu çağrılarak daha fazlası veya bir kısmı okunur. Aşaıdaki örnekte gösterilmiştir.

 TextReader tr = File.OpenText(@"c:\windows\win.ini");
            Console.WriteLine(tr.ReadToEnd());
            tr.Close();

tabi bu örneğimizde de system.io namespaceimizi kullanıyoruz.Burada TExtREader sınıfı  kullanılırken StreamReader
da kullanılabilirdi. StreamReader kullansaydık, File.openText veya StreamReader constructorunu kullanacaktık.
aşağıdaki örnektede aynı işi yapan streamReader sınıfı örneği gösterilmiştir:

            StreamReader sr = new StreamReader(@"c:\windows\win.ini");
            string giris;
            while ((giris = sr.ReadLine()) != null)
                Console.WriteLine(giris);
            sr.Close();
Bir text dosyasını okurken readline yada readtoend metodlarını kullanıyoruz.
Bir text dosyasına ver yazmak istediğimizde ise TextWriter veya StreamWriter kullanabiliriz.
sınıfın örneğini oluşturduktan sonra, konsol ekranından istediklerimizi dosyaya yazabiliriz.
TextWriter tw =File.CreateText("output.txt");
            tw.WriteLine("merhaaba dünya");
            tw.Close();

Binary Dosyalarda okuma yazma işlemi


Binary dosyaları  okuma ve yazma
binary dosyaları binarywriter ve binaryreader sınıflarını kullanarak saklayabilir ve text olmayan verilere de erişebilirsiniz.

Binary dosyalara yazma işlemi:

FileStream fs = new FileStream(@”d:\data.bin”, FileMode.Create);

BinaryWriter bw = new BinaryWriter(fs);
for (int i = 0; i < 100; i++)
{
bw.Write(i);

}
fs.Close();
bw.Close();

Binary dosyalardan okuma işlemi:
FileStream fs = new FileStream(@”d:\data.bin”,FileMode.Open,FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
for (int i = 0; i < 10; i++)
Console.WriteLine(br.ReadInt32());
br.Close();
fs.Close();

Stringlerde okuma yazma işlemi:

StringBuilder sınıfını da kullanarak StringWriter ile bir streame veri yazar gibi stringlere veri yazabilir ve stringReader ile bunu okuyabiliriz.
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
sw.WriteLine(“örnek yazı”);
sw.WriteLine(“deneme yazı”);
sw.Close();
yazılan stringi ise aşağıdaki kod yardımıyla okuyabiliriz:

StringReader sr = new StringReader(sb.ToString());
Console.WriteLine(sr.ReadLine());
Console.WriteLine(sr.ReadLine());

sr.Close();
Bu stringwriter ve stringbuilder nerde işe yarar? string nesnesi oluşturmak yerine bu şekilde kullanabilirsiniz.

MemoryStream nesnesinin kullanımı:
Sık kullanılan memoryStream nesnesi en nihayetinde bir dosyaya yazılacak olan veriyi geçici  olarak saklar. MemoryStreamı kullanarak bir dosyaya veri yazmak istediğinizde o dosyanın açılması verinin eklenmesi ve diske yazılması işlemlerinin tamamı için geçen zamanı ve de diğer kullanıcılarında o dosyaya erişmek istediğinde  -biz veri yazacağımız için açık olacağından- engellenmesinin önüne geçmiş oluruz. Aşağıdaki örnekte verinin geçici memoryStreame nasıl yazıldığı ve daha sonra text dosyasına verinin yazılması gösterilmektedir. Streamwriter sınıfını kullanarak kolaylıkla bir stringi memoryStreame yazabiliriz.Eger stringWriter kullanmazsak, MemoryStreama sadece byteları ve byte dizilerini okuyabilir ve yazabiliriz ve de bunu writeByte metoduyla yapabiliriz. Writebyte sadece tek bir bayt yazdırabilirken, Write metodu byte dizilerini yazdırır. Aynı şekilde readByte tek bir byte, Read metodu ise byte  dizilerini okur.

            MemoryStream ms = new MemoryStream();
            StreamWriter sw = new StreamWriter(ms);
            sw.WriteLine("merhabadünya");
            sw.Flush();
            ms.WriteTo(File.Create(@"d:\orn.txt"));
            sw.Close();
            ms.Close();

BufferedStream Kullanımı

Bufferedstream ile FileStream nesnesini kullanmaya gerek yoktur. FileStream nesnesi BufferedStream sınıfıyla  aynı mantıkta çalışır, böylece ikinci bir bufferlama katmanı gereksiz  ve verimsiz olacaktır. Gerçekte BufferedStream in kullanım amacı özel streamleri uygulamaktır dolayısıyla .net fw deki stream sınıfları zaten bufferlama yeteneğine sahiptir.

BufferedStream sınıfı memoryStream sınıfı gibi uygulanır. BufferedStream sınıfı da doğal olarak byte ve byte dizilerini yazmayı destekler.

Sıkıştırılmış Streamler

.net Fwda sıkıştırılmış streamler kullanarak daha az yer kaplayan uygulamalar yazabiliriz. Genel olarak text dosyaları, yüksek oranda sıkıştırılabilirler, binary dosyaları ise çok az oranda sıkıştırılabilirler çünkü binary dosyaları  zaten sıkışmış olarak kullanılır. MemoryStream sınıfı gibi, GZipStream sınıfını kullanarak sadece byteları ve byte dizilerini okuyabilir ve yazabilirsiniz. Bu yüzden eğer ki byte türünün haricinde veri saklamak istiyorsanız, Streamwriter streamReader kullanarak stringleri sıkıştırılmış streama yazabilir okuyabilirsiniz.

gzipStream sınıfın kullanımı aşağıda gösterilmiştir:

            GZipStream gzout = new GZipStream(File.Create(@"d:\ornek.zip"),CompressionMode.Compress);
            StreamWriter sw = new StreamWriter(gzout);
            for (int i = 0; i < 1000; i++)
                sw.Write("merhaba");
            sw.Close();
            gzout.Close();
okumak için ise:
            GZipStream gzipIn = new GZipStream(File.OpenRead(@"d:\ornek.zip"),CompressionMode.Decompress);
            StreamReader sr = new StreamReader(gzipIn);
            Console.WriteLine(sr.ReadToEnd());
            sr.Close();
            gzipIn.Close();

zip haliyle dosyamız 201 byte yer tutarken file stream nesnesiyle yapmış olsaydık 10kb civarında bellekte yer kaplayacaktı.

Isolated Storage Kullanımı

Isolated storage .net framework tarafından yönetilen özel dosya sistemidir.Standart dosya sistemine benzer.Dosyaya yazma ve dosyadan okuma işlemleri için bildiğimiz teknikleri(streamreader streamwriter gibi) kullanabiliriz.Buna rağmen isolated storage e yazarken direk dosya sistemine yazarkenden daha az imtiyaz gerekir ki buda daha az ayrıcalığın uygulanması demektir.

Ek olarak isolated storage  , user domain ve assemblye göre kişiselleşebilir.Dosya sistemindeki ek korumaları sağlamaz, isolated storage yüksek güvenlik sağlamaz, yüksek güvenlikli kodla korunmaz, unmanaged kod kullanır daha da doğrusu bilgisayardaki kullanıcılara güvenir.

Isolated Storage Tipleri

Isolated storage içindeki bir dosyaya erişirken onu yaratan kullanıcı daima kısıtlanmıştır. İzole edilen kullanıcıya ek olarak, özel bir assemblyin de isolated storage e erişimi genellikle kısıtlanmıştır. diğer bir değişle; AssemblyA tarafından yaratılan isolated storage e AssemblyB  nin erişimi kısıtlanmıştır.

Kullanıcının ve assembly in isolated storage na ek olarak; sizde assemblynizi izole edebilirsiniz: application domain yoluyla.

Isolated Storage Sınıflarıyla Çalışmak:

System.IO.isolatedStorage name spacei üç adet sınıf sunar:

IsolatedStorageFile:

Isolated storage ait saklama alanlarının yönetimini sağlar. münferit Saklama alanları ayrık isolated storage sistemleridir, bunlar 1 dosya sisteminin içersindedir.

IsolatedStoreFileStream:

Saklama alanlarındaki isolated storage dosyalarına okuma/yazma erişimi sağlar. Isolated Storage dosyaları geleneksel dosya sisteminde nasıl dosya direkt saklanıyorsa aynı şekilde davranır; buna rağmen isolated storage saklama alanındadır.

IsolatedStorageException:

Isolated Storage e ait exceptionların olduğu sınıfdır.

IsolatedStorageFile münferit saklama alanlarına erişim için, IsolatedStorageFileStream bu saklama alanlarındaki münferit dosyaları yönetim için kullanılır.

Isolated Storage e Nasıl Erişecez?

ISolated Storage  ile çalışırken aynı standart dosya sistemiyle çalışır gibi çalışırız. Öncelikle aşağıdaki farklılıkları yerine geitrmeliyiz:

*System.IO.IsolatedStorage namespacei ve System.IO namespacei ekleriz.

*Isolation tipini berlitmek için ISolatedStorageFile nesnesi declare edilir bu seçenek size kalmış

*Dosya sistemi nesneleri inşa edilir: streamWriters,StreamREaders ve diğer System.IO nesneleri, ki bunlar System.IO.IsolatedStorage  içersindedir.

Aşağıdaki kodda assembly tarafından izole edilen birkullanıcı alanı alınıyor, myfile.txt adında dosya yaratılıyor, isolated storage dosyası kullanmak için yeni bir streamwriter nesnesi yaratılıyor  tek satır yazı dosyaya yazılıyor ve isolated storage dosyası kapatılıyor. Application domain tarafından izole edilmiş alanı kullanmak için basit bir değişiklik gereklidir: IsolatedStorageFile.GetUserStoreForAssembly metodu yerine IsolatedStorageFile.GetUserStoreForDomain metodu çağrılır.

IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForAssembly();
            IsolatedStorageFileStream isoFile = new IsolatedStorageFileStream("myfile.txt", FileMode.Create, isoStore);
            StreamWriter sw = new StreamWriter(isoFile);
            sw.WriteLine("buyazı isolated store dosyasına yazılmıştır");
            sw.Close();
            IsolatedStorageFile isoStorageoku = IsolatedStorageFile.GetUserStoreForAssembly();
            IsolatedStorageFileStream isoDosya = new IsolatedStorageFileStream("myfile.txt",FileMode.Open,isoStore);
            StreamReader sr = new StreamReader(isoDosya);
            string dosyaicerik = sr.ReadLine();
            Console.WriteLine(dosyaicerik);
            sr.Close();
Bu myfile.txt dosyası nerde acaba?
win7de kullanıcıadı>appdata>local>isolatedStorage bu yoldan bulabilirsiniz.

bölümle ilgili uygulamalar aşağıdaki linklerde:

https://docs.google.com/open?id=0B3k7e25ssXt-ZDAzMTNiYzQtNDZhNi00YmQwLTk0YzgtZTgyNDkyZGJkOGZl

 

https://docs.google.com/open?id=0B3k7e25ssXt-NDJlZWQyZTUtN2I1Zi00OWZmLThiN2YtNTVmN2M2NDU4MDQ5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

, , , , , , , , , , , ,

  1. Yorum yapın

Yorum yapın

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Değiştir )

Twitter picture

You are commenting using your Twitter account. Log Out / Değiştir )

Facebook photo

You are commenting using your Facebook account. Log Out / Değiştir )

Connecting to %s

Follow

Get every new post delivered to your Inbox.