Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Создание потоков

Резервное хранилище — это устройство хранения информации, например диск или память. В каждом из резервных хранилищ используется собственный поток как реализация класса Stream. Каждый тип потока считывает и записывает байты в собственное резервное хранилище. Потоки, которые связаны с резервными хранилищами, называются базовыми. В конструкторах базовых потоков есть параметры, необходимые для присоединения потока к резервному хранилищу. Например, FileStream имеет конструктор, задающий путь, который определяет порядок совместного использования файла процессами и т. д.

Структура классов System.IO предоставляет упрощенное составление потоков. Базовые потоки могут быть присоединены к одному или нескольким сквозным потокам, которые обеспечивают требуемую функциональность. Модуль чтения или записи может быть присоединен к концу цепочки, что обеспечит легкое считывание или запись предпочитаемых типов.

В следующем примере кода создается поток FileStream для существующего файла MyFile.txt с целью буферизации файла MyFile.txt. (Обратите внимание, что экземпляры класса FileStreams буферизуются по умолчанию.) Затем создается StreamReader для чтения знаков из FileStream, который передается в StreamReader в качестве аргумента его конструктора. Метод ReadLine считывает до тех пор, пока Peek не находит более символов.

--------

The following code example creates a FileStream around the existing MyFile.txt in order to buffer MyFile.txt. (Note that FileStreams are buffered by default.) Next, a BinaryReader is created to read bytes from the FileStream, which is passed to the BinaryReader as its constructor argument. ReadByte reads until PeekChar finds no more bytes.

using System;

using System.IO;

public class ReadBuf

{

private const string FILE_NAME = "MyFile.txt";

public static void Main(String[] args)

{

if (!File.Exists(FILE_NAME))

{

Console.WriteLine("{0} does not exist.", FILE_NAME);

return;

}

FileStream f = new FileStream(FILE_NAME, FileMode.Open,

FileAccess.Read, FileShare.Read);

// Create an instance of BinaryReader that can

// read bytes from the FileStream.

BinaryReader sr = new BinaryReader(f);

// While not at the end of the file, read lines from the file.

while (sr.PeekChar()>-1)

{

byte input = sr.ReadByte();

Console.WriteLine (input);

}

sr.Close();

}

}

В следующем примере кода создается поток FileStream для существующего файла MyFile.txt с целью буферизации файла MyFile.txt. (Обратите внимание, что экземпляры класса FileStreams буферизуются по умолчанию.) Затем создается BinaryReader для чтения байтов из FileStream, который передается в BinaryReader в качестве аргумента его конструктора. Метод ReadByte считывает до тех пор, пока PeekChar не находит более байт.

-------

Creating a Writer

The following code example creates a writer, which is a class that can take data of some type and convert it to a byte array that can be passed to a stream.

using System;

using System.IO;

public class MyWriter

{

private Stream s;

public MyWriter(Stream stream)

{

s = stream;

}

public void WriteDouble(double myData)

{

byte[] b = BitConverter.GetBytes(myData);

// GetBytes is a binary representation of a double data type.

s.Write(b, 0, b.Length);

}

public void Close()

{

s.Close();

}

}

In this example, you create a class that has a constructor with a stream argument. From here, you can expose whatever Write methods are necessary. You must convert whatever you are writing to a byte[]. After you obtain the byte[],the Write method writes it to the stream s.