Классы StringReader и StringWriter


Если удобнее работать не с массивом байтов в ОП (класс MemoryStream), а с массивом строк, то целесообразно использовать классы StringReader и StringWriter (наследники классов TextReader и TextWriter).

 

Конструкторы:

 

StringReader (string str);

 

StringWriter();

 

Строка особого формата автоматически создается конструктором StringWriter().

 

using System;

using System.IO;

class StrRdrDemo

{

public static void Main()

{

 

// Создаем объект класса StringWriter.

StringWriter strWtr = new StringWriter();

// Записываем данные в StringWriter-объект.

for ( int i = 0; i < 10; i++ )

strWtr.WriteLine ("Значение i равно: " + i);

 

// Создаем объект класса StringReader.

StringReader strRdr = new StringReader (strWtr.ToString());

 

string str;

do

{

str = strRdr.ReadLine(); // Считываем данные из StringReader-объекта.

Console.WriteLine(str);

} while (str != null);

}

}

 

Двоичные потоки

Для выполнения операций ввода/вывода данных различных типов без их преобразований предназначены классы 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);

}

}

 



Дата добавления: 2019-02-08; просмотров: 671;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.022 сек.