Запись строки и байтов в один и тот же 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 только один раз и записать мою строку и мой байт один за другим?


person heltonbiker    schedule 07.04.2015    source источник
comment
Почему бы вам не преобразовать свои строки в байтовые массивы и тоже не записать их с помощью двоичного модуля записи?   -  person n0rd    schedule 08.04.2015
comment
Почему бы не записать вашу строку как байты (или байты как строку, если хотите)?   -  person Colin    schedule 08.04.2015
comment
Боковое примечание: я бы рекомендовал пересмотреть требование о том, что строки с префиксом длины не нужны - чтение намного проще, если вы заранее знаете длину.   -  person Alexei Levenkov    schedule 08.04.2015
comment
Что касается того, почему я не преобразовал строку в массив: конечно, потому что я этого не осознавал! Решил проблему с binaryWriter.Write(myString.ToCharArray()); или как вариант binaryWriter.Write(Encoding.UTF8.GetBytes(myString)).   -  person heltonbiker    schedule 08.04.2015
comment
Вероятно, вы захотите использовать System.Text.Encoding как CodeCaster, предложенный ниже.   -  person n0rd    schedule 08.04.2015


Ответы (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);
}

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

person CodeCaster    schedule 07.04.2015
comment
Разве FileStream.Write() не нужны дополнительные параметры, такие как позиция и размер массива? - person heltonbiker; 08.04.2015