Нужно ли выполнять StreamWriter.flush ()? - PullRequest
27 голосов
/ 29 июня 2009

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

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();
}

Мои вопросы:

  1. Нужно ли использовать флеш внутри цикл для сохранения порядка?
  2. Законно ли возвращение MemoryStream.ToArray()? Я использую using -блок в качестве соглашения, я боюсь, что все испортится.

Ответы [ 2 ]

24 голосов
/ 29 июня 2009

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

В любом случае, я бы поместил 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).

0 голосов
/ 29 июня 2009

Обновление

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


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