调用Stream.Write和使用StreamWriter有什么区别?

时间:2010-05-21 12:52:11

标签: c# memorystream streamwriter

实例化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; }

考虑以下情况:

你有一个方法,它接受一个Stream,写一个值,然后返回它。稍后将读取流,因此必须重置位置。有两种可能的方法(两者似乎都有效)。

{{1}}

这部分是一个范围问题,因为我不想在写入后关闭流,因为它将在以后读取。我当然也不想处理它,因为这将关闭我的流。差异似乎是不使用StreamWriter引入了对Encoding.Default的直接依赖,但我不确定这是一个非常大的问题。有什么区别,如果有的话?

4 个答案:

答案 0 :(得分:15)

使用StreamWriter,您可以获得更高级别的重载,可以将各种类型写入流,而无需担心细节。例如你的代码

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

实际上可能只是

sw.Write(value);

使用StreamWriter.Write(字符串)重载。

答案 1 :(得分:1)

byte[]数组而言,StreamWriter确实引入了其他更有用的方法来处理其他类型。

答案 2 :(得分:1)

一个区别是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);

答案 3 :(得分:0)

StreamWriter是Stream的一个超类,它实现了一个TextWriter,以便于处理文本。但由于它是一个超级类,除了文本处理方法之外,它还具有所有相同的方法。这就是为什么你需要在第一个例子中使用Encoding.Default.GetBytes(value)而在第二个例子中你不需要。