Каково различие между StreamWriter. Сброс () и StreamWriter. Близко ()?

Между чем различие в функциональности 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);
}
53
задан Gilad Green 25 February 2019 в 08:27
поделиться

5 ответов

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.
111
ответ дан 7 November 2019 в 08:27
поделиться

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

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

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

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

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

15
ответ дан 7 November 2019 в 08:27
поделиться

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

1
ответ дан 7 November 2019 в 08:27
поделиться

Из MSDN:

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

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

0
ответ дан 7 November 2019 в 08:27
поделиться

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

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

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

5
ответ дан 7 November 2019 в 08:27
поделиться
Другие вопросы по тегам:

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