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

В чем разница между StreamWriter.Flush() и StreamWriter.Close()?

В чем разница в функциональности между StreamWriter.Flush() и StreamWriter.Close()?

Когда мои данные не были правильно записаны в файл, я добавил оба конца Flush() и Close() в конец моего кода. Однако я понял, что добавление либо Flush(), либо Close() позволило правильно записать данные.

Мне не удалось понять, что делает каждый из этих методов, когда я читаю документы MSDN; Я только выяснил, что один или другой необходим, чтобы обеспечить правильную запись данных. Любое дальнейшее объяснение было бы высоко оценено.


Где s - это строка, которую нужно записать, вот как выглядит мой код в настоящее время:

        StreamWriter sw = File.CreateText("TextOutput.txt");
        sw.Write(s);
        sw.Flush();
        sw.Close();

Основываясь на отзывах ответов, я переписал свой код в блоке using, который реализует IDisposable и автоматически позаботится о записи потока в файл при размещении объекта:

        using (StreamWriter sw = File.CreateText("TextOutput.txt"))
        {
            sw.Write(s);
        }
4b9b3361

Ответ 1

StreamWriter.Flush() можно вызвать в любое время, когда вам нужно очистить буфер, и поток останется открытым.

StreamWriter.Close() предназначен для закрытия потока, и в этот момент буфер также очищается.

Но вам действительно не нужно звонить ни одному из них. Каждый раз, когда я вижу код .Close(), я воспринимаю это как запах кода, потому что обычно это означает, что неожиданное исключение может привести к тому, что ресурс останется открытым. Что вы должны сделать, создайте переменную StreamWriter в блоке использования, например:

using (var writer = new StreamWriter("somefilepath.txt"))
{
   // write a bunch of stuff here
} // the streamwriter WILL be closed and flushed here, even if an exception is thrown.

Ответ 2

StreamWriter.Flush() будет сбрасывать что-либо в потоке в файл. Это можно сделать в середине использования Stream, и вы можете продолжать писать.

StreamWriter.Close() закрывает поток для записи. Это включает в себя Flushing the Stream в последний раз.

Там лучший способ сделать что-то. Поскольку StreamWriter реализует IDisposable, вы можете обернуть StreamWriter в блок using.

using(StreamWriter sw = new StreamWriter(stream))
{
     // Work with things here
}

После блока using будет вызываться Dispose... который будет скрывать и закрывать поток для вас.

Ответ 3

У меня был случай, когда я писал очень длинную строку в StreamWriter с базовым MemoryStream. MemoryStream потреблялось чем-то еще, прежде чем писатель и поток были удалены.

using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream , Encoding.UTF8))
{
    streamWriter.Write(someRealyLongStringValue);
    DoSomethingWithTheStream(memoryStream );
}

С очень длинными строками конец строки был усечен. Это было разрешено путем вызова flush до того, как поток был использован. В качестве альтернативы я мог бы установить AutoFlush в true.

Ответ 4

Сбросить силы для записи буфера на диск. Закрыть - закрывает поток, а также выполняется операция внутренней очистки

Ответ 5

Из MSDN:

Flush: очищает все буферы для текущего автора и заставляет записывать буферные данные в базовый поток.

Закрыть: закрывает текущий объект StreamWriter и базовый поток.