Между чем различие в функциональности StreamWriter.Flush()
и StreamWriter.Close()
?
Когда мои данные не писались правильно в файл, я добавил обоих Flush()
и Close()
в конец моего кода. Однако я понял то добавление также Flush()
или Close()
позволенный данные, которые будут записаны правильно.
Я не смог взять на точно, что делает каждый из этих методов, когда я прочитал документы MSDN; я только выяснил, что один или другой необходимо, чтобы гарантировать, что данные записаны правильно. Дальнейшее объяснение очень ценилось бы.
Где s
строка должна быть записана, вот то, на что мой код в настоящее время похож:
StreamWriter sw = File.CreateText("TextOutput.txt");
sw.Write(s);
sw.Flush();
sw.Close();
На основе обратной связи от ответов я переписал свой код в a using
блок, который реализует IDisposable
и будет автоматически заботиться о записи потока в файл, когда объект будет расположен:
using (StreamWriter sw = File.CreateText("TextOutput.txt"))
{
sw.Write(s);
}
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.
StreamWriter.Flush ()
сбрасывает все, что есть в Stream, в файл. Это можно сделать во время использования Stream, и вы можете продолжать писать.
StreamWriter.Close ()
закрывает поток для записи. Это включает в себя последнюю промывку потока.
Но есть способ лучше. Поскольку StreamWriter реализует IDisposable
, вы можете заключить StreamWriter в , используя блок
.
using(StreamWriter sw = new StreamWriter(stream))
{
// Work with things here
}
После блока using
будет вызван Dispose
... который очистит и закроет поток для вас.
Сброс принудительно записывает буфер на диск. Close - закрывает поток, также выполняется операция внутренней очистки
Из MSDN:
Flush: очищает все буферы для текущего модуля записи и вызывает запись всех буферизованных данных в базовый поток.
Close: закрывает текущий объект StreamWriter и базовый поток.
У меня был случай, когда я писал очень длинную строку в StreamWriter с базовым MemoryStream. MemoryStream потреблялся чем-то еще до того, как писатель и поток были удалены.
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream , Encoding.UTF8))
{
streamWriter.Write(someRealyLongStringValue);
DoSomethingWithTheStream(memoryStream );
}
В случае очень длинных строк конец строки усекался. Это было решено вызовом flush перед использованием потока. В качестве альтернативы я мог бы установить для AutoFlush значение true.