Каково различие между инстанцированием a Stream
объект, такой как MemoryStream
и вызов memoryStream.Write()
метод для записи в поток, и инстанцирующий a StreamWriter
объект с потоком и вызовом streamWriter.Write()
?
Рассмотрите следующий сценарий:
У Вас есть метод, который берет Поток, пишет значение и возвращает его. Поток читается из позже, таким образом, положение должно быть сброшено. Существует два возможных способа сделать его (оба, кажется, работают).
// Instantiate a MemoryStream somewhere
// - Passed to the following two methods
MemoryStream memoryStream = new MemoryStream();
// Not using a StreamWriter
private static Stream WriteToStream(Stream stream, string value)
{
stream.Write(Encoding.Default.GetBytes(value), 0, value.Length);
stream.Flush();
stream.Position = 0;
return stream;
}
// Using a StreamWriter
private static Stream WriteToStreamWithWriter(Stream stream, string value)
{
StreamWriter sw = new StreamWriter(stream);
sw.Write(value, 0, value.Length);
sw.Flush();
stream.Position = 0;
return stream;
}
Это - частично проблема объема, поскольку я не хочу закрывать поток после записи в нее, так как она будет считана из позже. Я также, конечно, не хочу располагать его также, потому что это закроет мой поток. Различие, кажется, что не использование StreamWriter представляет прямую зависимость от Кодирования. Значение по умолчанию, но я не уверен, что это - очень грандиозное предприятие. Каково различие, если таковые имеются?
С StreamWriter у вас есть перегрузки более высокого уровня, которые могут записывать различные типы в поток, не беспокоясь о деталях. Например, ваш код
sw.Write(value, 0, value.Length);
на самом деле может быть просто
sw.Write(value);
Использование перегрузки StreamWriter.Write (строка).
Что касается массивов byte []
, ничего, StreamWriter
действительно представляет другие более полезные методы, хотя для работы с другими типами.
StreamWriter - это суперкласс Stream, который реализует TextWriter для упрощения обработки текста. Но поскольку это суперкласс, у него есть все те же методы в дополнение к методам обработки текста. Вот почему вам нужно Encoding.Default.GetBytes (value) в первом примере, а во втором - нет.