Двійкові файли зберігають дані в тому ж вигляді, в якому вони представлені в оперативній пам'яті, тобто у внутрішній формі представлення. Двійкові файли застосовуються не для перегляду їх людиною, а для використання в програмах. Вихідний потік BinaryWriter підтримує довільний доступ, тобто є можливість виконувати запис в довільну позицію двійкового файлу.
Двійковий файл відкривається на основі базового потоку, який найчастіше використовує потік FileStream.
Основні методи двійкових потоків приведені в таблицях 11.8 і 11.9.
Таблиця 11.8
Найбільш важливі елементи класу BinaryWriter
Елемент
| Опис
|
BaseStream
| Базовий потік, з яким працює об'єкт ВinaryWriter
|
Close
| Закрити потік
|
Flush
| Очистити буфер
|
Seek
| Встановити позицію в потоці
|
Write
| Записати значення в потік
|
Таблиця 11.9
Найбільш важливі елементи класу BinaryReader
Елемент
| Опис
|
BaseStream
| Базовий потік, з яким працює об'єкт BinaryReader
|
Close
| Закрити потік
|
PeekChar
| Повернути наступний символ без переміщення внутрішнього покажчика в потоці
|
Read
| Рахувати потік байтів або символів і зберегти в масиві
|
ReadXXXX
| Рахувати з потоку дані певного типу (наприклад, Readboolean, Readbyte, ReadInt32 і т. д.)
|
У лістингу 11.7 приведений приклад формування двійкового файлу. У файл записується послідовність дійсних чисел, а потім для демонстрації довільного доступу третє число замінюється числом 8888.
Лістинг 11.7. Формування двійкового файлу
using System;
using System.IO;
namespace examp81
{
class Class1
{
static void Main()
{
try
{
BinaryWriter fout = new BinaryWriter(
new FileStream(@"D:\1.txt", FileMode.Create));
double d = 0;
while ( d < 4 )
{
fout.Write( d );
d += 0.33;
};
fout.Seek( 16, SeekOrigin.Begin ); // другий елемент файлу
fout.Write( 8888d );
fout.Close();
}
catch( Exception e )
{
Console.WriteLine( "Error: " + e.Message );
return;
}
}
}
}
При створенні двійкового потоку в нього передається об'єкт базового потоку. При установці покажчика поточної позиції у файлі враховується довжина кожного значення типу doublе - 8 байт.
У лістингу 11.8 приводиться програма, яка за допомогою екземпляра Binaryreader прочитує вміст файлу в масив дійсних чисел, а потім виводить цей масив на екран.
При читанні береться до уваги, що метод ReadDoublе при виявленні кінця файлу генерує виключення EndOfStreamException. Оскільки в даному випадку це не помилка, тіло обробника виключень порожнє.
Лістинг 11.8. Читання двійкового файлу
using System;
using System.IO;
namespace examp82
{
class Class1
{
static void Main()
{
try
{
FileStream f =
new FileStream( @"D:\1.txt", FileMode.Open );
BinaryReader fin = new BinaryReader( f );
long n = f.Length / 8; // кількість чисел у файлі
double[] х = new double[n];
long i = 0;
try
{
while (true) х[i++] = fin.ReadDouble(); // читання
}
catch ( EndOfStreamException e ) {}
foreach (double d in х) Console.Write(" " + d); // виведення
fin.Close();
f.Close();
}
catch ( FileNotFoundException e )
{
Console.WriteLine( e.Message );
Console.WriteLine( " Перевірте правильність імені файлу!" );
return;
}
catch ( Exception e )
{
Console.WriteLine( "Error: " + e.Message );
return;
}
}
}
}
Результат роботи програми:
0 0,33 8888 0,99 1,32 1,65 1,98 2,31 2,64 2,97 3,3 3,63 3,96