В чем разница между вызовом stream.write и с использованием Streamwriter?

StackOverflow https://stackoverflow.com/questions/2882164

  •  04-10-2019
  •  | 
  •  

Вопрос

В чем разница между мракционным Stream объект, такой как MemoryStream и призывая memoryStream.Write() Способ для записи в поток и создать экземпляр 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, вводит прямую зависимость от кодирования. Odefault, но я не уверен, что это очень большое дело. В чем разница, если таковая имеется?

Это было полезно?

Решение

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

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

На самом деле мог просто быть

sw.Write(value);

Используя перегрузку streamwriter.write (строка).

Другие советы

Одно отличие в том, что 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);

StreamWriter - это суперкласс потока, который реализует текстура для более легкого обращения с текстом. Но с тех пор есть супер класс, он имеет все те же методы в дополнение к обработке текста. Это зачем вам нужна кодировка.default.getbytes (значение) в первом примере и во-вторых, вы не делаете.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top