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);
      }
    }
  }
}

 


Зв’язані теми