Запись строки и байтов в один и тот же FileStream

Мне нужно создать файл, в котором некоторые части являются строками (utf-8), а некоторые части являются байтами.

Я часами возился с StreamWriter а также BinaryWriter, но это единственное, что работает:

        using (var stream = new FileStream(_caminho, FileMode.Create, FileAccess.Write))
        {
            using (var writer = new StreamWriter(stream))
            {
                writer.Write(myString);
            }   
        }
        using (var stream = new FileStream(_caminho, FileMode.Append, FileAccess.Write))
        {
            using (var writer = new BinaryWriter(stream))
            {
                writer.Write(oneSingleByte);
            }
        }

Проблема в том, что мне нужно закрыть FileStream и открыть еще один, чтобы записать один байт, потому что либо BinaryStream.Write(string) метод добавляет поле "длина" (нежелательно в моем случае) или StreamWriter.Write(byte) кодирует значение байта вместо прямой записи.

Мой вопрос: есть ли другой класс, который я могу использовать, чтобы я мог создать FileStream только один раз и записывать мою строку и мой байт один за другим?

1 ответ

Решение

BinaryWriter префиксы записанные данные так BinaryReader могу прочитать. Без этих префиксов вы должны точно знать, что вы делаете при записи и чтении файла.

Вы можете опустить оба автора и напрямую записать в файл, если вы этого хотите:

using (var stream = new FileStream(_caminho, FileMode.Append, FileAccess.Write))
{
    stream.WriteByte('0'); 
    WriteString(stream, "foo", Encoding.UTF8);
}

private void WriteString(Stream stream, string stringToWrite, Encoding encoding)
{
    var charBuffer = encoding.GetBytes(stringToWrite);
    stream.Write(charBuffer, 0, charBuffer.Length);
}

Вам нужно будет явно указать кодировку, чтобы получить байты, как String.ToByteArray возвращает строку в виде символов Unicode, то есть языка.NET для "UTF-16LE", давая вам два байта на символ.

Другие вопросы по тегам