Ikkilik fayllar. BinariyWriter va BinaryReader
Ikkilik fayllar bilan ishlash uchun BinaryWriter va BinaryReader sinflari juftligi mo'ljallangan. Ushbu sinflar ma'lumotlarni ikki tomonlama formatda o'qish va yozish imkonini beradi.
BinaryWriter sinfining asosiy usullari
Close (): oqimni yopadi va resurslarni bo'shatadi
Flush (): qolgan ma'lumotlarni faylga qo'shish orqali buferni tozalaydi
Seek (): oqimdagi pozitsiyani belgilaydi
Yozish (): oqimdagi ma'lumotlarni yozib olish
BinaryReader sinfining asosiy usullari
Close (): oqimni yopadi va resurslarni bo'shatadi
ReadBoolean (): bool qiymatini o'qiydi va markerni bir baytga ko'chiradi
ReadByte (): bir baytni o'qiydi va bir baytga ishora qiladi
ReadChar (): char qiymatini o'qiydi, ya'ni, bir belgi, va ko'p bayt bir namoyishchi harakat, joriy kodlash bir belgi oladi, deb
ReadDecimal (): Decimal qiymatini o'qiydi va markerni 16 baytga ko'chiradi
ReadDouble (): qiymatini o'qiydi double va bir pointer harakat 8 bay
ReadInt16 (): qiymatini o'qiydi short va bir namoyishchi harakat 2 bayt
ReadInt32 (): qiymatini o'qiydi int va bir namoyishchi harakat 4 bayt
ReadInt64 (): Long qiymatini o'qiydi va markerni 8 baytga ko'chiradi
ReadSingle (): float qiymatini o'qiydi va markerni 4 baytga ko'chiradi
ReadString (): qiymatini o'qiydi string. Har bir satr 7-bit tamsayı vakili chiziq uzunligi qiymati bilan oldindan hisoblanadi
Ikkilik ma'lumotlarni o'qish bilan hamma narsa oddiy: tegishli usul ma'lum bir turdagi ma'lumotlarni o'qiydi va baytlarda ushbu turdagi o'lchamlarga ishora qiladi, masalan, int turi qiymati 4 baytni egallaydi, Shuning uchun BinaryReader 4 baytni hisoblaydi va bu 4 baytlarga ishora qiladi.
Keling, ushbu sinflarni qo'llashning haqiqiy vazifasini ko'rib chiqaylik. Keling, ulardan foydalanib, fayldan bir qator tuzilmalarni yozishga harakat qilaylik:
struct State
public string name;
public string capital;
public int area;
publc double people;
public State(string n, string c, int a, double p)
name = n;
capital = c;
people = p;
area = a;
class Program
static void Main(string[] args)
{
State[] states = new State[2];
matbuoti, radioeshittirishi va teleko'rsatuvi.;
davlat tuzumi [1] = yangi Davlat ("Fransiya", "Parij", 640679, 64.7);
string path= @"C:\SomeDir\states.dat";
try
// BinaryWriter ob'ektini yaratish
using (BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.OpenOrCreate)))
{
// har bir strukturaning qiymatini faylga yozing
foreach (State s in states)
writer.Write(s.name);
writer.Write(s.capital);
writer.Write(s.area);
writer.Write(s.people);
// BinaryReader ob'ektini yaratish
using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open)))
// fayl tugaguniga qadar
// faylning har bir qiymatini o'qing
while (reader.PeekChar() > -1)
string name = reader.ReadString();
string capital = reader.ReadString();
int area = reader.ReadInt32();
double population = reader.ReadDouble();
Console.WriteLine ("mamlakat: {0} poytaxt: {1} maydon {2} sq. km aholi soni: {3} million kishi.",
name, capital, area, population);
catch (Exception e)
Console.WriteLine(e.Message);
Console.ReadLine();
Shunday qilib, bizda ba'zi joylar bilan davlat tuzilishi mavjud. Asosiy dasturda biz bir qator tuzilmalar yaratamiz va BinaryWriter yordamida yozamiz. Dizayner bir parametr sifatida bu sinf ob'ekt oqim tomonidan qabul qilinadi, qaysi qo'ng'iroq fayl tomonidan yaratilgan.Open(path, FileMode.OpenOrCreate).
Keyin tsiklda biz tuzilmalar qatori bo'ylab harakat qilamiz va strukturaning har bir maydonini oqimga yozamiz. Ushbu maydon qiymatlari yozilgan tartibda ular faylga joylashtiriladi.
Keyin saqlangan fayldan o'qing. BinaryReader sinfining dizaynerlari, shuningdek, oqim ob'ektini parametr sifatida qabul qiladi, faqat bu holda filemode rejimi sifatida o'rnatiladi.Open: new BinaryReader(File.Open(path, FileMode.Open))
Tsiklda while ma'lumotlarni o'qish. Oqimning oxirini bilish uchun biz PeekChar () usulini chaqiramiz. Ushbu usul quyidagi belgini o'qiydi va uning raqamli ko'rinishini qaytaradi. Agar belgi mavjud bo'lmasa, usul -1-ni qaytaradi, bu faylning oxiriga yetgan degan ma'noni anglatadi.
Tsiklda biz tuzilmalar maydonining qiymatlarini ketma-ket o'qiymiz, ular qayd etilgan tartibda.
BinaryWriter va BinaryReader sinflari ikkilik fayllar bilan ishlash uchun juda qulaydir, ayniqsa, biz ushbu fayllarning tuzilishini bilganimizda. Shu bilan birga, yanada murakkab ob'ektlarni, masalan, sinf ob'ektlarini saqlash va o'qish uchun yana bir yechim - ketma-ketlik yaxshi mos keladi.
O'tgan mavzularda matn va ikkilik fayllardan ma'lumotlarni kosmosdan sinflardan qanday saqlash va o'qish mumkinligi ko'rib chiqildi System.IO. ammo. net shuningdek, ikkilik fayllar va ularning ma'lumotlari bilan qulay ishlash uchun yana bir mexanizmni taqdim etadi - ikkilik ketma-ketlik. Seriallashuv har qanday ob'ektni bayt oqimiga aylantirish jarayonidir. Konvertatsiya qilgandan so'ng, biz bu bayt oqimini yoki diskka yozishimiz yoki uni vaqtincha xotirada saqlashimiz mumkin. Va agar kerak bo'lsa, teskari jarayonni amalga oshirishingiz mumkin - Deserializatsiya, ya'ni oldindan saqlangan ob'ekt bayt oqimidan olinadi.
Serializable Xususiyati
Muayyan sinfning ob'ektini serializatsiya qilish uchun ushbu sinfni Serializable xususiyati bilan belgilash kerak:
[Serializable]
class Person
public string Name { get; set; }
public int Year { get; set; }
public Person(string name, int year)
Name = name;
Year = year;
Ushbu atributning orqasida qolganda, Person ob'ekti serializatsiyaga uchramaydi va serializatsiyaga urinayotganda SerializationException istisnosi chiqariladi.
Seriallashuv sinfning xususiyatlari va maydonlariga qo'llaniladi. Agar biz sinfning bir qismini ketma-ket qilishni xohlamasak, unda biz uni NonSerialized xususiyati bilan belgilaymiz:
[Serializable]
class Person
public string Name { get; set; }
public int Year { get; set; }
[NonSerialized]
public string accNumber;
public Person(string name, int year, string acc)
Name = name;
Year = year;
Do'stlaringiz bilan baham: |