C#. Класс StreamWriter. Назначение. Конструкторы




Класс StreamWriter. Назначение. Конструкторы. Создание потока вывода разными способами

Данная тема есть родственной теме:


Содержание


Поиск на других ресурсах:

1. Класс StreamWriter. Назначение

Класс StreamWriter предназначен для записи в поток символьных данных. Данный класс является унаследованным от абстрактного класса TextWriter и реализует часть его методов. На рисунке 1 изображен перечень основных методов, которые наследует класс StreamWriter.

C#. Перечень основных методов и свойств, которые наследует класс StreamWriter от класса TextWriter

Рисунок 1. Перечень основных методов и свойств, которые наследует класс StreamWriter от класса TextWriter

Более подробно об объявлении и использовании методов класса StreamWriter описывается в следующей теме.

 

2. Конструкторы класса StreamWriter. Создание потока связанного с текстовым файлом

Класс StreamWriter содержит значительное количество конструкторов, предназначенных для создания потока вывода различными способами.

2.1. Конструкторы, создающие поток вывода на основании пути к файлу

 

public StreamWriter(string path)
public StreamWriter(string path, bool append)
public StreamWriter(string path, bool append, System.Text.Encoding encoding)
public StreamWriter(string path, bool append, System.Text.Encoding encoding, int bufferSize)

здесь

  • path – путь к файлу, например «C:\\1\\myfile.txt»;
  • append – флажок, определяющий возможность добавления данных в конец файла. Если append = true, то данные добавляются в конец файла. Иначе данные перезаписываются;
  • encoding – кодировка символов;
  • bufferSize – размер буфера для записи в файл. Запись в файл происходит порциями размером bufferSize.

При использовании конструкторов могут возникать исключительные ситуации следующих типов:

  • System.UnautorizedAccessException – генерируется, когда доступ запрещен;
  • System.ArgumentException — возникает, когда путь path является пустым или содержит имя системного устройства (например, com1, com2, lpt1 и т.п.);
  • System.ArgumentNullException — возникает, когда значение path = null;
  • System.IO.DirectoryNotFoundException — генерируется, когда неправильно определен путь path;
  • System.IO.IOException — значение path включает некорректный синтаксис имени файла, папки или метки тома;
  • System.IO.PathTooLongException — возникает когда значение path и/или имя файла превышают максимально-допустимую длину определяемую системой;
  • System.Security.SecurityException — возникает когда вызывающий поток не имеет необходимого разрешения.

Пример.

// Подключить пространство имен System, System.IO
using System;
using System.IO;

...

try
{
  // Создание разных файловых потоков
  // 1. Поток, связанный с файлом "file1.txt"
  StreamWriter fOut1 = new StreamWriter("file1.txt");

  // 2. Поток, связанный с файлом "file2.txt"
  StreamWriter fOut2 = new StreamWriter("file2.txt", false);

  // 3. Поток, связанный с файлом "file3.txt"
  StreamWriter fOut3 = new StreamWriter("file3.txt", false,
  System.Text.Encoding.UTF8);

  // 4. Поток, который связан с файлом "file4.txt"
  StreamWriter fOut4 = new StreamWriter("file4.txt", false,
  System.Text.Encoding.ASCII, 1024);

  // Выполнение действий в потоках
  // ...

  // Закрыть потоки
  fOut1.Close();
  fOut2.Close();
  fOut3.Close();
  fOut4.Close();
}
catch (UnauthorizedAccessException e)
{
  Console.WriteLine("UnauthorizedException");
}
catch (ArgumentException e)
{
  Console.WriteLine("Agrument error.");
}
catch (DirectoryNotFoundException e)
{
  Console.WriteLine("Directory not found.");
}
catch (IOException e)
{
  Console.WriteLine("Input/output error.");
}
catch(System.Security.SecurityException e)
{
  Console.WriteLine("Security error.");
}

...

 

2.2. Конструкторы, создающие файловый поток вывода на основе другого потока

На основе другого потока типа Stream можно создавать поток вывода типа StreamReader. Для этого используются следующие конструкторы:

public StreamWriter(System.IO.Stream stream)
public StreamWriter(System.IO.Stream stream, System.Text.Encoding encoding)
public StreamWriter(System.IO.Stream stream, System.Text.Encoding encoding, int bufferSize)
public StreamWriter(System.IO.Stream stream, [System.Text.Encoding encoding = null], [int bufferSize = -1], [bool leaveOpen = False])

здесь

  • stream – поток типа Stream. Класс Stream есть базовым для всех классов потоков;
  • encoding – система кодировки;
  • bufferSize – размер буфера в байтах;
  • leaveOpen – если leaveOpen=true, то поток остается открытым после удаления объекта StreamWriter, иначе leaveOpen=false.

Пример.

// Подключить пространство имен System, System.IO
using System;
using System.IO;

...

try
{
  // Создание файловых потоков на основе других потоков

  // 1. Связь с файлом "file1.txt" в кодировке UTF-8
  FileStream fs1 = new FileStream("file1.txt",FileMode.Open,
FileAccess.Write);
  StreamWriter fOut1 = new StreamWriter(fs1,
System.Text.Encoding.UTF8);

  // 2. Поток, связанный с файлом "file2.txt"
  FileStream fs2 = new FileStream("file2.txt", FileMode.Open,
FileAccess.Write);
  StreamWriter fOut2 = new StreamWriter(fs2);

  // Выполнение действий в потоках
  // ...

  // Закрыть потоки
  fOut1.Close();
  fOut2.Close();
}
catch (System.Exception e)
{
  Console.WriteLine(e.Message);
}

...

 

3. Применение оператора using() при создании потока вывода

Для того, чтобы не уволят ресурсы, выделенные для файлового потока, можно воспользоваться оператором using(). Этот оператор позволяет освобождать эти ресурсы автоматически.

Пример. В примере создается несколько потоков с помощью оператора using().

// Подключить пространства имен System, System.IO
using System;
using System.IO;

...

// Создание файловых потоков на основе других потоков
// с использованием оператора using()
using (FileStream fs1 = new FileStream("file1.txt", FileMode.Open, FileAccess.Write),
  fs2 = new FileStream("file2.txt", FileMode.Open, FileAccess.Write))
{
  using (StreamWriter fOut1 = new StreamWriter(fs1,
System.Text.Encoding.UTF8), fOut2 = new StreamWriter(fs2))
  {
    // Выполнение действий в потоках
    // ...
  }
}

...

 

4. Пример создания файла с нулевой длиной средствами StreamWriter. Самый простой способ использования конструктора

Чтобы создать файл с нулевой длиной (без данных) с помощью класса StreamWriter, достаточно написать следующий код

...

// Подключить пространство имен System.IO
using System.IO;

...

// Объявить экземпляр класса StreamWriter
StreamWriter fOut = new StreamWriter("myfile1.txt");

// Закрыть поток
fOut.Close();

...

В примере выше, создается файл с именем myfile1.txt в текущем (относительно исполняемого файла) каталоге.

 


Связанные темы