В чем разница между StreamWriter.Flush () и StreamWriter.Close ()? - PullRequest
50 голосов
/ 10 марта 2010

Какая разница в функциональности между 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);
}

Ответы [ 5 ]

102 голосов
/ 10 марта 2010

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

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

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

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.
11 голосов
/ 10 марта 2010

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

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

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

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

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

5 голосов
/ 29 июня 2010

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

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

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

1 голос
/ 10 марта 2010

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

0 голосов
/ 10 марта 2010

Из MSDN:

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

Close: Закрыть текущий объект StreamWriter и нижележащийпоток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...