В чем разница между 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);
}
Ответы
Ответ 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 и базовый поток.