Двоичные потоки
Для выполнения операций ввода/вывода данных различных типов без их преобразований предназначены классы BinaryReader и ВinaryWriter. Важно понимать, что эти данные считываются и записы- ваются с использованием внутреннего двоичного формата, а не в тексто- вой форме, понятной человеку.
Классы BinaryReader и ВinaryWriter
представляют собой оболочку для байтового
потока, которая управляет чтением\записью двоичных дан- ных.
рис.2
Наиболее употребительный конструктор класса BinaryWriter имеет вид:
BinaryWriter ( Stream stream [, Encoding] )
Наиболее употребительный конструктор класса BinaryReader имеет вид:
BinaryReader (Stream stream [, Encoding])
stream - поток, в который будут записываться/ считываться данные. Чтобы записать двоичные данные в файл или прочитать из файла,
можно использовать для этого параметра объект, созданный классом
FileStream.
Методы вывода данных класса BinaryWriter
|
Метод |
Описание |
|
void Write (sbyte val) |
Записывает byte-значение (со знаком) |
|
void Write (byte val) |
Записывает byte-значение (без знака) |
|
void Write (byte [ ] buf) |
Записывает массив byte-значений |
|
void Write (short val) |
Записывает целочисленное значение типа short короткое целое) |
|
void Write (ushort val) |
Записывает целочисленное ushort - значение (короткое целое без знака) |
|
void Write (int val) |
Записывает целочисленное значение типа int |
|
void Write (uint val) |
Записывает целочисленное uint- значение (целое без знака) |
|
void Write (long val) |
Записывает целочисленное значение типа long (длинное целое) |
|
void Write (ulong val) |
Записывает целочисленное ulong- значение (длинное целое без знака) |
|
void Write (float val) |
Записывает float-значение |
|
void Write (double val) |
Записывает double-значение |
|
void Write (char val) |
Записывает символ |
|
void Write (char [ ] buf) |
Записывает массив символов |
|
void Write (string val) |
Записывает string-значение с исполь- зованием его внутреннего представления, которое включает спецификатор длины |
Методы ввода данных, определенные в классе BinaryReader
|
Метод |
Описание |
|
bool ReadBoolean() |
Считывает bool-значение |
|
byte ReadByte() |
Считывает byte-значение |
|
sbyte ReadSByte() |
Считывает sbyte-значение |
|
byte[ ] ReadBytes(int num) |
Считывает num байтов и возвра- щает их в виде массива |
|
char ReadChar() |
Считывает char-значение |
|
char[ ] ReadChars(int num) |
Считывает num символов и воз- вращает их в виде массива |
|
double ReadDouble() |
Считывает double-значение |
|
float ReadSingle() |
Считывает float-значение |
|
short Readlnt16() |
Считывает short-значение |
|
int Readlnt32() |
Считывает int-значение |
|
long Readlnt64() |
Считывает long-значение |
|
ushort ReadUInt16() |
Считывает ushort -значение |
|
uint ReadUInt32() |
Считывает uint-значение |
|
ulong ReadUInt64() |
Считывает ulong-значение |
|
string ReadString() |
Считывает string-значение, пред- ставленное во внутреннем двоичном формате, который включает специфи- катор длины. Этот метод следует ис- пользовать для считывания строки, которая была записана с помощью объекта класса BinaryWriter |
|
int Read () |
Возвращает целочисленное пред- ставление следующего доступного символа из вызывающего входного потока. При обнаружении конца фай- ла возвращает значение -1 |
|
int Read (byte [ ] buf, int offset, int num) |
Делает попытку прочитать num байтов в массив buf, начиная с эле- мента buf[offset], и возвращает коли- чество успешно считанных байтов |
|
int Read (char [ ] buf, int offset, int num) |
Делает попытку прочитать num символов в массив buf, начиная с эле- мента buf[offset], и возвращает коли- чество успешно считанных символов |
Исключения, генерируемые классами BinaryReader и ВinaryWriter:
|
ArgumentException |
поток stream не открыт для вво- да/вывода |
|||
|
ArgumentNullException |
поток stream имеет null-значение |
|||
|
IOException |
ошибка ввода/вывода |
|||
|
EndOfStreamException |
Обнаружен Read...) |
конец |
потока |
(для |
Пример. (Без обработки исключений.)
// Запись в файл двоичных данных с последующим их считыванием. using System;
using System.IO;
class RWData
{
public static void Main()
{
BinaryWriter dataOut; BinaryReader dataIn; FileStream fs;
int i = 10;
double d = 1023.56;
bool b = true;
fs = new FileStream ("testdata", FileMode.Create); dataOut = new BinaryWriter (fs);
dataOut.Write (i); dataOut.Write (d); dataOut.Write (b); dataOut.Write (12.2 * 7.4);
dataOut.Close();
// Теперь попробуем прочитать эти данные.
fs = new FileStream ("testdata", FileMode.Open); dataIn = new BinaryReader(fs);
i = dataIn.ReadInt32();
d = dataIn.ReadDouble(); b = dataIn.ReadBoolean(); d = dataIn.ReadDouble();
dataIn.Close();
Console.WriteLine ("Прочитали " + i); Console.WriteLine ("Прочитали " + d); Console.WriteLine ("Прочитали " + b); Console.WriteLine ("Прочитали " + d);
}
}
Пример. С обработкой исключений.
// Запись в файл двоичных данных с последующим их считыванием. using System;
using System.IO;
class RWData
{
public static void Main()
{
BinaryWriter dataOut;
BinaryReader dataIn;
FileStream fs;
int i = 10;
double d = 1023.56; bool b = true;
try
{
fs = new FileStream("testdata", FileMode.Create); dataOut = new BinaryWriter(fs);
}
catch (IOException exc)
{
Console.WriteLine(exc.Message + "\nHe удается открыть файл."); return;
}
try
{
dataOut.Write(i); dataOut.Write(d); dataOut.Write(b); dataOut.Write(12.2 * 7.4);
}
catch (IOException exc)
{
Console.WriteLine(exc.Message + "\nОшибка при записи.");
}
dataOut.Close();
// Теперь попробуем прочитать эти данные. try
{
fs = new FileStream("testdata", FileMode.Open); dataIn = new BinaryReader(fs);
}
catch (FileNotFoundException exc)
{
Console.WriteLine(exc.Message + "\nHe удается открыть файл."); return;
}
try
{
i = dataIn.ReadInt32();
d = dataIn.ReadDouble(); b = dataIn.ReadBoolean(); d = dataIn.ReadDouble();
}
catch (IOException exc)
{
Console.WriteLine(exc.Message + "Ошибка при считывании.");
}
dataIn.Close(); Console.WriteLine("Прочитали " + i); Console.WriteLine("Прочитали " + d); Console.WriteLine("Прочитали " + b); Console.WriteLine("Прочитали " + d);
}
}
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.