Вопрос по c# – Нужно ли выполнять StreamWriter.flush ()?

27

Предположим, этот код 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();
}

Мои вопросы:

Do I need to use flush inside the loop to preserve order? Is returning MemoryStream.ToArray() legal? I using the using-block as a convention, I'm afraid it will mess things up.

Ваш Ответ

2   ответа
24

что вы используете две обертки для одного потока. Мне это немного рискованно.

В любом случае, я бы поставил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 sAutoFlush свойство true, чтобы смягчить ситуацию, а я Верю чтоBinaryWriter в настоящее время нена самом дел требует очистки (то есть не буферизует никаких данных), но полагаться на это кажется рискованным.

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

Обтекание одного потока двумя потоковыми программами записи кажется опасным / подверженным ошибкам, хотя я не думаю, что очистка их в этом случае что-то сделает. Flush не влияет на чтение MemoryStream, а только на запись буферизованных байтов в их соответствующие потоки. mbillard
Это влияет на порядок, в котором значения могут быть записаны, хотя - если вы не установите для AutoFlush значение true, StreamWriter может долго ничего не записывать в MemoryStream (илиКогда-либ если не распоряжаешься). Мне это кажется хрупким. Jon Skeet
дело в том, что я хочу новую строку в конце имени, и WriteLine кажется безопасным способом для этого. Nefzen
"Сброс не влияет на чтение MemoryStream, только на запись буферизованных байтов в их соответствующие потоки" .... но это именно то, что делает OP ... запись. dss539
@ Nefzen - см. Environment.NewLine Msdn.microsoft.com / EN-US / библиотека / ... dss539
0

Обновит

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

Нет, порядок будет сохранен Обновить возможно, нет). Flush полезен / необходим в других ситуациях, хотя я не могу вспомнить, когда.Я так думаю,с помощь следит за тем, чтобы все было хорошо.
Я не думаю, что порядоквол Обязательно сохраняйте, между бинарным писателем и потоковым писателем здесь - вы можете получить загрузку значений из двоичного записывающего устройства и затем ценность следующего буфера потокового записывающего устройства. Jon Skeet
1. Нет, заказ не будет сохранен. 2. Нетusing неDispose() normalWriter или binaryWriter. dss539
Оба писателя используют один и тот же буфер? mbillard
@ Crossbrowser: Нет - BinaryWriter не знает о StreamWriter или наоборот. StreamWriter имеет свой собственный буфер. Jon Skeet
Дам, я был так смущен, что продолжал сосредотачиваться на роли писателя, не думая, что один из авторов взял его источник из того, что другой написал в потоке. В этом случае я думаю, что необходим только первый сброс. mbillard

Похожие вопросы