Чтение и запись текстовых файлов

Теоретически можно с успехом использовать класс FileStream для чтения и ото­бражения текстовых файлов. Если вы знаете, что определенный файл содержит текст, то обычно сочтете более удобным читать и писать его с помощью классов StreamReader и StreamWriter вместо FileStream. Дело в том, что эти классы ра­ботают на чуть более высоком уровне и специально настроены на чтение и запись текста. Реализуемые ими методы могут автоматически определять, где удобно рас­ставлять точки останова чтения, на основе содержимого потока. В частности:

Эти классы реализуют методы построчного чтения и записи текста — StreamReader.ReadLine() и StreamWriter.WriteLine(). В случае чтения это означает, что поток автоматически определяет местоположение очередно­го символа возврата каретки и прекращает чтение в этой точке. В случае запи­си это значит, что поток автоматически добавляет комбинацию символов но­вой строки к записываемому тексту.

Используя классы StreamReader и StreamWriter, нет нужды заботиться о ко­дировке (текстового формата), используемой в файле. Возможные кодировки включают ASCII (1 байт на каждый символ), или любой из основанных на Uni­code форматов - UNICODE, UTF7, UTF8 и UTF32. Текстовые файлы в системах Windows 9x всегда имеют кодировку ASCII, потому что Windows 9x не под­держивает Unicode, тем не менее, Windows NT, 2000, ХР и 2003 Unicode под­держивают, а потому текстовые файлы могут теоретически содержать данные в кодировках UNICODE, UTF7, UTF8 и UTF32 вместо ASCII. Существует со­глашение, что если файл создан в формате ASCII, то он просто содержит текст. Если же он имеет какой-то из форматов Unicode, это может быть указано в первых двух или трех байтах файла, которые составляют определенную ком­бинацию значений, задающую конкретный формат данного файла.

Эти байты называют маркерами байтовой кодировки (byte code markers). Когда вы открываете файл с помощью любого стандартного приложения Windows, подобного Notepad или WordPad, то вам не придется заботиться об этом, поскольку эти прило­жения в состоянии различить кодировку и правильно прочитать файл. То же касает­ся и класса StrearaReader, который корректно читает файлы любого из этих форма­тов, в то время как класс StreamWriter в состоянии форматировать записываемый текст, используя указанную вами кодировку. С другой стороны, если вы хотите читать и отображать текстовый файл, используя класс FileStream, вам придется заботиться об этом самостоятельно.

Единственное, что может делать StreamReader —это читать! Более того, не существует прямой оп­ции указания прав разделенного доступа. Однако имеется пара других:

Необходимо указать, что делать с разными методами кодировки. Можно инст­руктировать StreamReader, чтобы он проверял маркеры байтовой кодировки в начале файла для определения метода кодировки, либо просто принудитель­но использовал заданную кодировку.

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

Поскольку StreamReader работает на относительно высоком уровне, то, имея другой поток, предназначенный для чтения некоторого другого источника, может оказаться удобным применить средства обработки текстов StreamReader к данным этого потока. И это можно сделать, просто передав конструктору StreamReader ссылку на этот поток. Таким образом, StreamReader может использоваться для чте­ния и обработки данных из любого источника, а не только из файлов.

Кодировка указывается с помощью некоторых свойств класса System. Text. Encoding. Это абстрактный базовый класс, от которого наследуется множество классов, реали­зующих методы, выполняющие кодирование текстов. Каждое свойство возвращает экземпляр соответствующего класса, и можно использовать следующие свойства:

- ascii

- Unicode

- UTF7

- UTF8

- UTF32

Пример. Расположить на форме компоненты «Кнопка», «Поле для ввода», «Список». Перезаписать содержимое listBox1 в файл Potok.txt c возможностью записи и чтения. Прочитать файл Potok.txt начиная с 12 позиции, результат поместить в textBox1.Text.

FileStream fs = new FileStream(@"c:\Potok.txt", FileMode.Create);

byte[] bt =new byte[100];

textBox1.Text="";

int i = listBox1.Items.Count;

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

{

string ms;

ms = listBox1.Items[k].ToString();

int k1 = ms.Length;

for (int n = 0; n < k1; n++)

fs.WriteByte((byte)ms[n]);

}

i = 0;

i =(int) fs.Length;

fs.Seek(12,SeekOrigin.Begin);

int i1=(int) fs.Position;

fs.Read(bt,0,i);

fs.Close();

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

textBox1.Text +=(char) bt[n];

Пример. Используя класс BufferedStream прочитать файл с диска.

FileStream fs = new FileStream(@"c:\Potok.txt", FileMode.Open);

BufferedStream bs = new BufferedStream(fs);

byte[] bt =new byte[100];

long i=fs.Length;

bs.Read(bt, 0, (int)i);

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

textBox1.Text += (char)bt[n];

fs.Close;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: