Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
файлы лекция (основная).pdf
Скачиваний:
31
Добавлен:
15.04.2015
Размер:
938.85 Кб
Скачать

Если при чтении такого файла средствами класса BinaryReader вы забудете указать кодировку символов, результат может быть неожиданным:

Text string

О 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Файл успешно создан

В самом деле, так как система не знает заранее, в какой кодировке находятся символы, она будет использовать кодировку по умолчанию, т. с, ANSI. В результате вместо одного символа текстовой строки мы увидим символ и пробел.

Если же кодировка указана правильно, программа выведет на консоль строку без ошибок в исходном виде;

Text string

0 1 2 3 4 5 б 7 8 9 10 11 12 13 14 15 16 17 18 19 Файл успешно создан

6 Буферизация потоков

Для ускорения операций обмена данными с диском часто применяется механизм буферизации. Он основан на том, что прежде чем попасть на диск, данные предварительно накапливаются в буфере, расположенном в оперативной памяти. Затем, когда к диску нет обращений, данные из буфера переписываются на диск.

Ускорение достигается за счет того, что фактически программа пишет данные не на диск, а в оперативную память, обладающую высоким быстродействием. Во время простоев компьютера, когда он не занят другой работой, данные переписываются на диск.

Разумеется, буферизация дает ускорение работы программ не всегда, а только в тех случаях, когда программа периодически обращается к одним и тем же фрагментам файла или выполняет последовательное чтение или запись файла.

6.1 Буферизация двоичных потоков

Напомним, что двоичные потоки создаются при BinaryWriter и BinaryReader. Потоки FileStream буферизованными. Для задания размера буфера соответствующий перегруженный конструктор:

помощи классов FileStream, по умолчанию являются мы должны использовать

FileStream is = new FileStream(testFile, FileMode.CreateNew, FileAccess.Write, FileShare.Read, 10000);

Через первый параметр этому конструктору передается путь к файлу, с которым связывается поток. Второй параметр задает режим открытия файла. Третий и четвертый параметр определяют соответственно режим доступа к файлу и режим совместного использования файла.

Что же касается размера буфера, то он задается последним, пятым параметром и указывается в байтах.

Создав таким способом поток класса FileStream, необходимо образовать на его основе поток BinaryWriter:

BinaryWriter bw = new BinaryWriter(fs);

Далее этот поток можно использовать для записи как обычно, добавляя в него данные

методом Write.

Если вам нужен выходной буферизованный двоичный поток, то он создается так:

fs = new FileStream(testFile, FileMode.Open, FileAccess.Read, FileShare,Read, 10000);

В дальнейшем на базе этого потока можно создать входной поток класса BinaryReader:

BinaryReader br = new BinaryReader{fs);

Работа с буферизованными двоичными потоками данных демонстрируется в программе, исходный текст которой приведен в листинге 6. Мы оставляем ее вам на самостоятельное изучение.

Листинг 6.

using System; using System.IO;

namespace BinaryBufEered

{

class BinaryBufferedApp

{

private const string testFile = "mydata,dat";

static void Main(string[] args)

{

if(File.Exists(testFile))

{

Console.WriteLine("Файл {0> уже существует", testFile) ; Console.ReadLine(); return;

}

FileStream fs = new FileStream(testFile, FileMode.CreateNew, FileAccess.Write, FileShare.Read, 10000);

BinaryWriter bw = new BinaryWriter (fs); bw.Write("Text string");

for(uint i = 0; i < 20; i++)

{

bw.Write((uint)i);

}

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

fs = new FileStream(testFile, FileMode.Open, FileAccess.Read, FileShare.Read, 10000);

BinaryReader br = new BinaryReader(fs);

string s = br.Readstring(); Console.WriteLine(s);

for (uint i = 0; i < 20; i++)

{

Console.Write("{0} ", br.ReadUInt32());

}

br.Close(); fs.Close();

Console.WriteLine("\пФайл успешно создан"); Console.ReadLine();

}

}

}

6.2 Буферизация текстовых потоков

Потоки, связанные с текстовыми файлами, также можно буферизовать. Для этого нужно воспользоваться соответствующими перегруженными конструкторами в классах StreamWriter и StreamReader.

Вот как создается выходной буферизованный текстовый поток:

StreamWriter sw = new StreamWriter(testFile, false, Sys tern.Text.Encoding.UNICODE, 10000);

Первые 3 параметра конструктора класса StreamWriter задают соответственно путь к файлу, флаг добавления новых данных в файл и кодировку данных. Размер буфера определяется в байтах при помощи четвертого параметра.

Входной буферизованный поток данных создается при помощи следующего конструктора класса StreamReader:

StreamReader sr = new StreamReader(testFile, System.Text.Encoding.UNICODE, true, 10000);

Размер буфера задастся последним, четвертым параметром конструктора. Обратите внимание на третий параметр конструктора класса StreamReader. Если этот параметр равен true, при открытии файла его тип будет автоматически определяться по сигнатуре, т. е, по начальным байтам файла. Напомним, что текстовые

файлы в кодировке UNICODE содержат 2-байтовую сигнатуру, определяющую порядок следования остальных байтов файла. Об этом мы рассказывали выше в разделе «Кодировка текстовых потоков».

Полный пример программы, работающей с буферизованными текстовыми потоками, приведен в листинге 7.

Листинг 7.

using System; using System.IO;

namespace TextFileBuffered

{

class TextFUeBufferedApp

{

private const string testFile = "mydata,txt";

static void Main(stringU args)

{

if(File.Exists(testFile))

{

Console.WriteLine("Файл { 0} уже существует", testFile); Console.ReadLine();

return;

}

StreamWriter sw = new StreamWriter(testFile, false, System.Text.Encoding.UNICODE, 10000);

sw.WriteLine("Каждый охотник желает знать, где сидит фазан!");

sw.WriteLine ("Число \"Пи\" равно примерно {0}.", 3.1415926); sw.Close();

StreamReader sr = new StreamReader(testFile, System.Text.Encoding.UNICODE, true, 10000);

while(true)

{

String str = sr.ReadLine();

if (str == null) break; Console.WriteLine(str);

}

sr.Close();

Console.WriteLine ( "Файл успешно создан"); Console.ReadLine();

}

}

}