Подтвердить что ты не робот

Нужно ли делать StreamWriter.flush()?

Предположим, что этот код С#:

using (MemoryStream stream = new MemoryStream())
{
    StreamWriter normalWriter = new StreamWriter(stream);
    BinaryWriter binaryWriter = new BinaryWriter(stream);

    foreach(...)
    {
        binaryWriter.Write(number);
        normalWriter.WriteLine(name); //<~~ easier to reader afterward.
    }

    return MemoryStream.ToArray();
}

Мои вопросы:

  • Нужно ли использовать флеш внутри цикл для сохранения порядка?
  • Возвращает MemoryStream.ToArray() legal? Я использую using -block как соглашение, я боюсь, что это испортит ситуацию.
4b9b3361

Ответ 1

Поцарапайте предыдущий ответ - я не заметил, что вы использовали две обертки вокруг одного потока. Мне это кажется несколько рискованным.

В любом случае, я бы поставил StreamWriter и BinaryWriter в свои собственные блоки using.

О, и да, это право называть ToArray() на MemoryStream - данные сохраняются даже после его размещения.

Если вы действительно хотите использовать две оболочки, я бы сделал это следующим образом:

using (MemoryStream stream = new MemoryStream())
{
    using (StreamWriter normalWriter = new StreamWriter(stream))
    using (BinaryWriter binaryWriter = new BinaryWriter(stream))
    {
        foreach(...)
        {
            binaryWriter.Write(number);
            binaryWriter.Flush();
            normalWriter.WriteLine(name); //<~~ easier to read afterward.
            normalWriter.Flush();
        }
    }    
    return MemoryStream.ToArray();
}

Я должен сказать, что я немного опасаюсь использовать две обертки вокруг одного и того же потока. После каждой операции вам придется продолжать промывать каждую из них, чтобы убедиться, что вы не попали в нечетные данные. Вы можете установить для свойства StreamWriter AutoFlush значение true, чтобы уменьшить ситуацию, и я считаю, что BinaryWriter в настоящее время фактически не требуется (т.е. он не хранит никаких данных), но полагаясь на то, что это опасно.

Если вам нужно смешивать двоичные и текстовые данные, я бы использовал BinaryWriter и явно записывал байты для строки, получая ее с помощью Encoding.GetBytes(string).

Ответ 2

Обновление

Не обращай внимания на этот ответ, я смутился с писателями...


  • Нет, порядок будет сохранен ( update:, возможно, нет). Flush полезен/необходим в других ситуациях, хотя я не могу вспомнить, когда.
  • Я так думаю, используя все, чтобы все было хорошо очищено.