C#. Класс Stream. Операции (методы) записи в файловый поток

Класс Stream. Операции (методы) записи в файловый поток. Примеры

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


Содержание


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




1. Операции записи в поток. Краткий обзор

Для записи в поток используются следующие свойства и методы (операции):

  • свойство CanWrite — определяет возможность потока осуществлять запись;
  • метод Write() — записывает последовательность байт в текущий поток;
  • метод WriteByte() — записывает байт в текущий поток.

 

2. Свойство CanWrite. Пример

С помощью свойства CanWrite можно определить, поддерживает ли поток запись данных. Общая форма свойства следующая:

public abstract bool CanWrite { get; }

Если поток допускает возможность записи, то свойство CanWrite возвращает true. Иначе возвращается false.

Пример. В примере создается поток stream, который связан с файлом «myfile.txt». Затем с помощью свойства CanWrite определяется, поддерживает поток запись.

using System;
using System.IO;

namespace ConsoleApp10
{
  class Program
  {
    static void Main(string[] args)
    {
      // 1. Создать поток и связать его с файлом "myfile.txt"
      Stream stream;

      using (stream = new FileStream("myfile.txt", FileMode.Create))
      {
        // 2. Свойство CanWrite - определить, допускает ли поток запись
        if (stream.CanWrite)
          Console.WriteLine("Stream supports writing.");
        else
          Console.WriteLine("Stream does not support writing");

        // 3. Закрыть поток
        stream.Close();
      }
    }
  }
}

 

3. Метод Write(). Пример

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

public abstract void Write(byte[] buffer, int offset, int count);

здесь

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

Пример. В примере записывается двумерный массив типа int[] в бинарный файл. Затем этот массив считывается из файла для контроля.

using System;
using System.IO;

namespace ConsoleApp10
{
  class Program
  {
    static void Main(string[] args)
    {
      // Записать массив строк в файл
      using (FileStream fw = new FileStream("integers.dat", FileMode.Create, FileAccess.Write))
      {
        // Исходный массив целых чисел
        int[,] AI = { { 2, 3, 5},
                      { 1, 8, 7 },
                      { 4, 2, 3 },
                      { -1, -2, 0 }
                    };

        // Дополнительные переменные
        byte[] AB;

        // Сначала записать размерность массива 3*4
        // Количество строк
        int rows = AI.GetLength(0);
        AB = BitConverter.GetBytes(rows);
        fw.Write(AB, 0, AB.Length);

        // Количество столбцов
        int columns = AI.Length / AI.GetLength(0);
        AB = BitConverter.GetBytes(columns);
        fw.Write(AB, 0, AB.Length);

        // Цикл записи чисел
        for (int i = 0; i < rows; i++)
          for (int j = 0; j < columns; j++)
          {
            // записать число AI[i, j]
            AB = BitConverter.GetBytes(AI[i, j]);
            fw.Write(AB, 0, AB.Length);
          }
      }

      // Считать из файла массив строк
      using (FileStream fr = new FileStream("integers.dat", FileMode.Open, FileAccess.Read))
      {
        // Результирующий массив
        int[,] AI2;

        // Дополнительные переменные
        int rows, columns;
        byte[] AB;

        // Прочитать количество строк
        AB = new byte[sizeof(int)];
        fr.Read(AB, 0, AB.Length);
        rows = BitConverter.ToInt32(AB, 0);

        // Считать количество столбцов
        AB = new byte[sizeof(int)];
        fr.Read(AB, 0, AB.Length);
        columns = BitConverter.ToInt32(AB, 0);

        // Выделить память для массива ссылок
        AI2 = new int[rows, columns];

        // Цикл чтения чисел типа int
        for (int i = 0; i < rows; i++)
          for (int j = 0; j < columns; j++)
          {
            fr.Read(AB, 0, AB.Length);
            AI2[i, j] = BitConverter.ToInt32(AB, 0);
          }

        // Вывести результат
        Console.WriteLine("rows = {0}, columns = {1}", rows, columns);

        for (int i = 0; i < rows; i++)
        {
          for (int j = 0; j < columns; j++)
          {
            Console.Write("{0} ", AI2[i, j]);
          }
          Console.WriteLine();
        }
      }
    }
  }
}

Результат выполнения программы

rows = 4, columns = 3
2 3 5
1 8 7
4 2 3
-1 -2 0

 

4. Метод WriteByte(). Пример

Метод WriteByte() предназначен для записи в поток (файл) в текущей позиции одного байта. Согласно документации C# общая форма метода WriteByte() следующая:

public virtual void WriteByte(byte value)

здесь value – байт, который нужно записать.

Пример. В примере сочетаются методы WriteByte() и ReadByte(). Нужно записать строку в файл методом WriteByte(). Затем эта строка считывается методом ReadByte().

using System;
using System.IO;

namespace ConsoleApp10
{
  class Program
  {
    static void Main(string[] args)
    {
      // Демонстрация сочетания методов WriteByte() и ReadByte()
      using (FileStream fWrite = new FileStream("myfile.bin", FileMode.Create, FileAccess.Write))
      {
        // Строка, которую нужно записать в файл
        string str = "bestprog.net";

        // Цикл побайтной записи - метод WriteByte()
        foreach (char c in str)
          fWrite.WriteByte((byte)c);
      }

      // Считывание строки из файла
      using (FileStream fRead = new FileStream("myfile.bin", FileMode.Open, FileAccess.Read))
      {
        // Дополнительные переменные
        string str2 = ""; // результирующая строка
        int bt;

        // Цикл побайтного чтения из файла - метод ReadByte()
        while ((bt = fRead.ReadByte()) != -1)
          str2 += (char)bt; // прибавить к строке прочитанный байт как символ

        // Вывести результат на экран
        Console.WriteLine(str2);
      }
    }
  }
}

 


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