Кодировка текстовых потоков
В C# используются следующие статические свойства класса System.Text.Encoding для кодировки текстовых потоков
Кодировка | Описание |
ASCII | Кодировка ASCII без символов кириллицы, в которой для представления текстовых символов используются младшие 7 бит байта |
Unicode | Кодировка UNICODE. Для представления символов используется 16 бит (т. е. 2 байта). Сигнатура = FF FE в нач.файла для StreamWriter |
UTF7 | Кодировка UCS Transformation Format. Применяется для представления символов UNICODE. В ней используются младшие 7 бит данных |
UTF8 | To же, но для представления символов UNICODE в ней используется 8 бит данных |
Default | Системная кодировка ANSI (не путайте ее с кодировкой ASCII). В этой кодировке для представления каждого символа используется 8 бит данных |
Свойства класса кодировки System.Text.Encoding:
ASCII – 1 байт (старший бит = 0);
Default – по умолчанию (UTF8);
Unicode – 2 байта;
UTF32 – 4 байта;
UTF7 – 1 байт, старший бит не используется;
UTF8 – 1 байт (по умолчанию в .NET).
ФАЙЛЫ В ОП, ДВОИЧНЫЕ ПОТОКИ,
НЕПОТОКОВЫЙ ВВОД-ВЫВОД, ПРЯМОЙ ДОСТУП К ФАЙЛУ.
Файлы в оперативной памяти
Присоединение массива байтов к классам StreamReader или StreamWriter.
Класс MemoryStream
Иногда удобно создать модель файла в ОП. В этом случае нужно заменить открытие файла на создание потока в памяти.
Класс MemoryStream определяет поток байтов в оперативной памяти (см. рис.1). Класс MemoryStream — это реализация класса Stream.
рис.1
Для работы с этим потоком могут использоваться классы StreamReader и StreamWriter. С помощью их методов можно считывать входные данные из массива байтов или записывать их в массив.
Один из конструкторов класса MemoryStream:
MemoryStream (byte[ ] buf)
buf — это массив байтов, который предполагается использовать в операциях ввода-вывода в качестве источника и/или приемника информации.
• Поток доступен как на чтение, так и на запись.
• В поток, создаваемый этим конструктором, можно записывать данные или считывать их из него.
• Перед использованием этого конструктора необходимо позаботиться о достаточном размере массива buf, чтобы он позволил сохранить все направляемые в него данные.
• Этот поток поддерживает метод Seek(), который позволяет перед выполнением чтения/записи сместиться к любому байту массива.
Пример:
// Демонстрация использования класса MemoryStream.
using System;
using System.IO;
class MemStrDemo
{
public static void Main()
{
byte[ ] storage = new byte[255]; // Модель файла
// Создаем поток с ориентацией на память.
MemoryStream mem = new MemoryStream (storage);
// Помещаем объект mem в оболочку StreamWriter.
StreamWriter memWtr = new StreamWriter (mem);
// Записываем данные в память с помощью объекта memWtr.
for (int i = 0; i < 10; i++)
memWtr.WriteLine ("byte [{0}]: {0}", i);
memWtr.Write ('.'); // Ставим в конце точку.
memWtr.Flush (); // Форсируем вывод
Console.WriteLine ("Считываем данные прямо из массива storage: ");
// Отображаем напрямую содержимое памяти.
foreach (char ch in storage)
{
if (ch == '.') break; // После точки будет EOF, который является концом строки.
Console.Write (ch);
}
Console.WriteLine("\nСчитываем данные посредством объекта memRdr: ");
// Помещаем объект mem в оболочку StreamReader.
StreamReader memRdr = new StreamReader (mem);
// Считываем данные из объекта mem, используя средство чтения потоков.
mem.Seek (0, SeekOrigin.Begin); // Установка указателя позиции
// в начало потока.
string str = memRdr.ReadLine();
while (str != null)
{
str = memRdr.ReadLine();
if (str.CompareTo(".") == 0) break; // После точки следует EOF,
// поэтому точка считывается как строка.
Console.WriteLine(str);
}
}
}
Вот как выглядят результаты выполнения этой программы:
Считываем данные прямо из массива storage:
byte [0] : 0
byte [1] : 1
byte [2] : 2
byte [3] : 3
byte [4] : 4
byte [5] : 5
byte [6] : 6
byte [7] : 7
byte [8] : 8
byte [9] : 9
Считываем данные посредством объекта memRdr:
byte [0] : 0
byte [1] : 1
byte [2] : 2
byte [3] : 3
byte [4] : 4
byte [5] : 5
byte [6] : 6
byte [7] : 7
byte [8] : 8
byte [9] : 9
Вместо
mem.Seek (0, SeekOrigin.Begin);
можно применить
memWtr.Close();
mem = new MemoryStream (storage);
Дата добавления: 2019-02-08; просмотров: 593;