C#. Класс StreamWriter. Обзор методов и свойств




Класс StreamWriter. Обзор методов и свойств

Данная тема есть продолжением темы:


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


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

1. Методы класса StreamWriter

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

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

 

1.1. Метод Close(). Закрытие потока вывода

Метод Close() предназначен для закрытия потока вывода и освобождения ресурсов. Объявление метода следующее

public override void Close();

При использовании метода для кодировки Unicode может быть сгенерировано исключение следующего типа

  • System.Text.EncoderFallBackException — текущая кодировка не поддерживает отображение половины суррогатной пары Unicode.

Пример.

// Создать поток StreamWriter
StreamWriter fOut = new StreamWriter("myfile2.txt");

// Использование потока
// ...

// Закрити потік оператором Close()
fOut.Close();

 

1.2. Метод Flush(). Очистка буферов

Метод Flush() используется для очистки всех буферов для текущего потока. Объявление метода следующее:

public override void Flush();

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

  • System.ObjectDisposedException — текущий поток вывода закрыт;
  • System.IO.IOException — ошибка ввода/вывода;
  • System.Text.EncoderFallBackException — текущая кодировка не поддерживает отображение половины суррогатной пары Unicode.

Пример.

// Создать поток StreamWriter
StreamWriter fOut = new StreamWriter("myfile2.txt");

// Очистить буфер
fOut.Flush();

// Использование потока
// ...

 

1.3. Методы записи в файловый поток данных, которые представлены отдельными символами

Класс StreamWriter представляет целый набор перегруженных методов Write() или WriteLine() для записи текстовой информации в файловый поток разными способами.

1.3.1. Метод Write(char). Запись одиночного символа

Данный метод позволяет записывать посимвольно в файловый поток

public override void Write(char value);

здесь value – записываемое значение.

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

  • System.IO.IOException — ошибка ввода/вывода;
  • System.ObjectDisposedException — возникает в случаях, когда значение свойства AutoFlush = true или буфер StreamWriter полон и поток вывода закрыт;
  • System.NonSupportedException — генерируется когда свойство AutoFlush имеет значение true или буфер StreamWriter заполнен и содержание буфера может быть записано в базовый поток фиксированного размера.

Пример. В примере в файл посимвольно записывается строка, введенная с клавиатуры.

...

using (StreamWriter fOut = new StreamWriter("myfile2.txt"))
{
  // Ввести строку с клавиатуры
  string s;
  Console.WriteLine("Enter string:");
  s = Console.ReadLine();

  // Разбить строку s на массив типа char[]
  char[] array = s.ToCharArray();

  // Записать посимвольно в поток fOut
  foreach (char c in array)
    fOut.Write(c);
}

...

 

1.3.2. Метод Write(char[]). Запись массива символов

Для записи массива char[] в файл используется метод Write() с последующим объявлением

public override void Write(char[] buffer);

здесь

  • buffer – массив символов, содержащий данные, которые должны быть записаны. Если buffer равен null, то ничего не записывается.

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

  • System.IO.IOException — ошибка ввода/вывода;
  • System.ObjectDisposedException — возникает в случаях, когда значение свойства AutoFlush = true или буфер StreamWriter является полным и поток вывода является закрытым;
  • System.NonSupportedException — генерируется когда свойство AutoFlush имеет значение true или буфер StreamWriter заполнен и содержание буфера может быть записано в базовый поток фиксированного размера.

Пример. В примере в файл записывается массив строк типа string[]. После каждой строки записывается символ новой строки с помощью метода WriteLine().

...

using (StreamWriter fOut = new StreamWriter("myfile2.txt"))
{
  // Исходный массив строк
  string[] AS = { "line - 1", "line - 2", "line - 3" };
  char[] buffer;

  // Цикл записи массива AS в файл
  for (int i = 0; i < AS.Length; i++)
  {
    // конвертировать строку string в char[]
    buffer = AS[i].ToCharArray();

    // запись buffer в файл
    fOut.Write(buffer);

    // перевод строки
    fOut.WriteLine();
  }
}

...

 

1.3.3. Метод Write(char[], int, int). Запись массива символов с указанием диапазона

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

public override void Write(char[] buffer, int index, int count);

здесь

  • buffer — массив символов, содержащий данные, которые должны быть записаны;
  • index — позиция символа в буфере с которой начинается чтение данных;
  • count — максимальное количество символов, которое может быть записано.

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

  • System.ArgumentNullException — случай, когда значение buffer = null;
  • System.ArgumentException — генерируется в случае, если значение count является больше значения длины буфера минус index;
  • System.ArgumentOutOfRangeException — значение index или count отрицательны;
  • System.IO.IOException — генерируется ошибка ввода/вывода;
  • System.ObjectDisposedException — возникает в случаях, когда значение свойства AutoFlush = true или буфер StreamWriter полон и поток вывода закрыт;
  • System.NonSupportedException — генерируется когда свойство AutoFlush имеет значение true или буфер StreamWriter заполнен и содержание буфера может быть записано в базовый поток фиксированного размера.

Пример. В примере в файл записываются первые 5 символов массива строк типа string[]. Все остальные символы отсекаются.

using (StreamWriter fOut = new StreamWriter("myfile2.txt"))
{
  // Исходный массив строк
  string[] AS = { "aldkfjasldj", "ladjkflaj", "iouweoiwe" };

  // буфер для представления строки как char[]
  char[] buffer;

  // Цикл записи массива AS в файл
  for (int i = 0; i < AS.Length; i++)
  {
    // конвертировать строку string в char[]
    buffer = AS[i].ToCharArray();

    // запись buffer в файл
    fOut.Write(buffer, 0, 5); // записать первые 5 символов

    // перевод строки
    fOut.WriteLine();
  }
}

 

1.4. Методы записи строк типа string в поток
1.4.1. Методы Write(string) и WriteLine(string). Запись строки

Методы Write() и WriteLine() с параметром типа string предназначены для записи строки в поток. Объявления методов следующие

public override void Write(string value);
public override void WriteLine(string value);

здесь value – строка, которая записывается в поток.

Метод WriteLine() в отличие от метода Write() дополнительно записывает символ новой строки в поток.

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

  • System.IO.IOException — ошибка ввода/вывода;
  • System.ObjectDisposedException — возникает в случаях, когда значение свойства AutoFlush = true или буфер StreamWriter является полным и поток вывода является закрытым;
  • System.NonSupportedException — генерируется когда свойство AutoFlush имеет значение true или буфер StreamWriter заполнен и содержание буфера может быть записано в базовый поток фиксированного размера.

Пример. В примере в файл записывается массив строк типа string[]. Используется метод WriteLine().

...

using (StreamWriter fOut = new StreamWriter("myfile2.txt"))
{
  // Исходный массив строк
  string[] AS = {
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"
  };

  // Цикл записи массива AS в файл
  for (int i = 0; i < AS.Length; i++)
  {
    // метод WriteLine()
    fOut.WriteLine(AS[i]);
  }
}

...

 

1.4.2. Методы Write(string, object) и WriteLine(string, object). Запись в поток форматированной строки с одним аргументом

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

public override void Write(string format, object arg0)
public override void WriteLine(string format, object arg0)

Пример. Записывается в файл число типа double с точностью 3 знака после запятой.

static void Main(string[] args)
{

  using (StreamWriter fOut = new StreamWriter("myfile2.txt"))
  {
    // Запись числа типа double в файл с точностью 3 знака после запятой
    fOut.Write("{0:f3}", Math.PI); // 3.142
  }
}

 

1.4.3. Методы Write(string, object, object) и WriteLine(string, object, object). Запись форматованной строки с двумя аргументами

 

public override void Write(string format, object arg0, object arg1);
public override void WriteLine(string format, object arg0, object arg1);

Пример. Записать в файл два числа: целое число и число типа float.

using (StreamWriter fOut = new StreamWriter("myfile2.txt"))
{
  // Запись числа типа int и числа типа float
  int d = 27;
  float x = 3.2309f;
  fOut.Write("{0} {1:f}", d, x); // 27 3.23
}

 

1.4.4. Методы Write(string, object, object, object) и WriteLine(string, object, object, object). Запись форматованной строки с тремя аргументами
public override void Write(string format, object arg0, object arg1, object arg2);
public override void WriteLine(string format, object arg0, object arg1, object arg2);

Пример. Записать в файл три числа типа int.

using (StreamWriter fOut = new StreamWriter("myfile2.txt"))
{
  // Запись трех чисел типа int в файл
  int d1 = 88, d2 = 323, d3 = 15;
  fOut.Write("{0} {1} {2}", d1, d2, d3); // 88 323 15
}

 

1.4.5. Метод Write(string, object[]). Запись форматованной строки с любым количеством аргументов

Объявления методов, которые записывают любое количество произвольных аргументов следующее:

public override void Write(string format, params object[] arg);
public override void WriteLine(string format, params object[] arg);

Пример. Задан массив координат отрезков (x1, y1), (x2, y2). Нужно записать в файл эти координаты.

using (StreamWriter fOut = new StreamWriter("myfile2.txt"))
{
  // Запись массива координат в файл
  int[,] Lines = {
    { 2, 5, 3, -1 },
    { 4, 7, 2, 9 },
    { -1, -3, 2, 8 }
  };

  // Цикл записи массива в файл
  for (int i = 0; i < Lines.Length / 4; i++)
  {
    fOut.WriteLine("x1 = {0}, y1 = {1}, x2 = {2}, y2 = {3}",
      Lines[i, 0], Lines[i, 1], Lines[i, 2], Lines[i, 3]);
  }
}

 

2. Свойства
2.1. Свойство AutoFlush

Возвращает или задает значение, указывающее, будет ли экземпляр StreamWriter очищать буфер после каждого вызова метода Write(System.Char). Объявления метода следующее

public virtual bool AutoFlush { get; set; }

Значение true заставляет StreamWriter очищать свой поток.

Пример.

using (StreamWriter fOut = new StreamWriter("myfile2.txt"))
{
  // Указание очищать буфер
  fOut.AutoFlush = true;

  // некоторые действия
  // ...

}

 

2.2. Свойство Encoding

Для определения системы кодировки используется свойство Encoding.

public override System.Text.Encoding Encoding { get; }

Система кодировки задается в конструкторе при создании текущего экземпляра. Если система кодировки не задана явно, то по умолчанию устанавливается значение

System.Text.UTF8Encoding

Пример.

// Запись в системе кодировки ASCII
using (FileStream fs = new FileStream("myfile2.txt", FileMode.Open, FileAccess.Write))
{
  using (StreamWriter fOut = new StreamWriter(fs,
    System.Text.Encoding.ASCII))
  {
    // Записать строку в файл.
    fOut.WriteLine("Hello world!");

    // Записать также текущую систему кодировки
    // с помощью свойства Encoding
    string name = fOut.Encoding.BodyName;
    fOut.WriteLine(name);
  }
}

 


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