В чем разница между вызовом stream.write и с использованием Streamwriter?
-
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
Представляет другие более полезные методы, хотя для работы с другими типами.