实例化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的直接依赖,但我不确定这是一个非常大的问题。有什么区别,如果有的话?
答案 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)而在第二个例子中你不需要。