Запись строки и байтов в один и тот же 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", давая вам два байта на символ.