Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ЛИПО .doc
Скачиваний:
0
Добавлен:
06.12.2018
Размер:
441.86 Кб
Скачать

Бинарный ввод и вывод при помощи класса FileStream

FileStream используется для чтения и записи отдельных байтов или блоков байтов. Поскольку символы — ничто иное, как байты, FileStream можно использовать и для потоков символов. Однако он не имеет таких удобных методов для работы с символь­ными потоками, как StreamReader и StreamWriter.

Класс FileStream можно использовать для создания новых файлов или для работы с уже существующими.

Некоторые члены класса FileStream:

Член класса FileStream

Описание

Close

Закрывает выходной поток и освобождает ассоциированные с ним ресурсы.

ReadByte

Читает один байт из входного потока.

WriteByte

Пишет один байт в выходной поток.

Length

Возвращает длину потока (в байтах).

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

class TestBytesInOut

{

//Метод создает файл и записывает в него числа от 0 до 10

public static void WriteBytes()

{

FileStream outStream = null;

try

{

//

FileInfo bytesFile = new FileInfo (@"C:\MyTestFiles\numbers1.dat");

outStream = bytesFile.OpenWrite();

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

{

outStream.WriteByte(i);

}

}

catch (IOException exObj)

{

Console.WriteLine(exObj);

}

finally

{

outStream.Close();

}

}

//Метод читает числа из файла

public static void ReadBytes()

{

int totalSum = 0;

int temp = 0;

FileStream inStream = null;

try

{

FileInfo numberFile = new FileInfo (@"C:\MyTestFiles\numbers1.dat");

inStream = numberFile.OpenRead();

Console.WriteLine("Length: " + inStream.Length);

Console.WriteLine("Содержание файла");

for (int i = 0; i < inStream.Length; i++)

{

temp = inStream.ReadByte();

Console.WriteLine(temp);

totalSum += temp;

}

Console.WriteLine("\nTotal sum of numbers in file: {0}", totalSum);

}

catch (IOException exObj)

{

Console.WriteLine(exObj);

}

finally

{

inStream.Close();

}

}

}

class Tester

{

public static void Main()

{

TestBytesInOut.WriteBytes();

TestBytesInOut.ReadBytes();

Console.ReadLine();

}

}

Метод WriteBytes показывает, каким образом класс FileStream можно использовать для создания нового файла, а затем для записи в него десяти чисел типа byte. Метод ReadBytes применяет FileStream для пос­ледующего их чтения из этого файла.

Для создания нового объекта FileStream можно использовать собственный конструк­тор FileStream, или методы Filelnfo. Второй путь применен в листинге 22.3, где OpenWrite (строка 13) и OpenRead (строка 41) используются для получения бинарных потоков типа FileStream.

Для записи данных, объектом outStream типа FileStream создается новый файл C:\MyTestFiles\numbersl.dat. Метод WriteByte принимает один аргумент типа byte и записывает его туда. В нашем случае в записываются первые десять чисел (начиная с нуля).

Следует отметить, что файл C:\MyTestFiles\numbersl.dat — не текстовый, а бинар­ный, текстовым редактором просмотреть его нельзя. Для просмотра можно использо­вать поток типа FileStream, возвращенный методом OpenRead.

Свойство Length позволяет определить, сколько раз должен выполниться цикл for. Это имеет смысл, поскольку:

  • Length возвращает число байт в inStream

  • цикл будет повторятся Length раз

  • при каждой итерации цикла считывается один байт, начиная с первого.

Таким образом, каждый байт из numbersl.dat присваивается переменной temp и выводится затем на консоль.

Данные из numbersl.dat можно использовать в вычислениях. В нашем случае, на каждом шаге temp прибавляется к totalSum (что и определяет сумму всех чисел из файла numbersl.dat). Результат выводится на консоль.

■ ■

80