В чем разница между вызовом Stream.Write и использованием StreamWriter? - PullRequest
15 голосов
/ 21 мая 2010

В чем разница между созданием объекта Stream, такого как MemoryStream, и вызовом метода memoryStream.Write() для записи в поток, и созданием объекта StreamWriter в потоке и вызовом streamWriter.Write()?

Рассмотрим следующий сценарий:

У вас есть метод, который принимает Stream, записывает значение и возвращает его. Поток читается позже, поэтому позиция должна быть сброшена. Есть два возможных способа сделать это (оба, кажется, работают).

// 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 создает прямую зависимость от Encoding.Default, но я не уверен, что это очень большая проблема. Какая разница, если есть?

Ответы [ 4 ]

15 голосов
/ 21 мая 2010

С StreamWriter вы получаете перегрузки более высокого уровня, которые могут записывать различные типы в поток, не беспокоясь о деталях. Например твой код

sw.Write(value, 0, value.Length);

Может быть просто

sw.Write(value);

Использование перегрузки StreamWriter.Write (string).

1 голос
/ 18 апреля 2018

Одно отличие состоит в том, что new StreamWriter(stream) по умолчанию использует кодировку UTF-8, поэтому он будет поддерживать данные Unicode. Encoding.Default (по крайней мере, на моем компьютере) является кодовой страницей фиксированного размера (например, Windows-1250) и поддерживает только ASCII и ограниченный набор национальных символов (всего 256 различных символов).

Вы действительно не должны делать следующее:

stream.Write(encoding.GetBytes(value), 0, value.Length);

Это просто совпадение, что используемая кодировка имеет фиксированный размер 1 байт. (Это не будет работать с UTF-16 или с данными UTF-8 и не-ASCII.) Вместо этого, если вам нужно напрямую записать в поток, выполните:

byte[] byteData=encoding.GetBytes(value);
stream.Write(byteData, 0, byteData.Length);
1 голос
/ 21 мая 2010

С точки зрения массивов byte[], ничего, StreamWriter действительно вводит другие более полезные методы для работы с другими типами.

0 голосов
/ 21 мая 2010

StreamWriter - это суперкласс Stream, который реализует TextWriter для облегчения обработки текста. Но поскольку это суперкласс, у него есть все те же методы в дополнение к тем, которые используются для обработки текста. Вот почему вам нужен Encoding.Default.GetBytes (значение) в первом примере, а во втором - нет.

...