实例化
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 的直接依赖,但我不确定这有什么大不了的。 如果有的话,有什么区别?
使用 StreamWriter,您可以拥有更高级别的重载,可以将各种类型写入流,而无需担心细节。例如你的代码
sw.Write(value, 0, value.Length);
实际上可能只是
sw.Write(value);
使用 StreamWriter.Write(string) 重载。
一个区别是
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 是 Stream 的超类,它实现了 TextWriter 以更轻松地处理文本。但由于它是一个超类,因此除了文本处理方法之外,它还具有所有相同的方法。这就是为什么您在第一个示例中需要 Encoding.Default.GetBytes(value) 而在第二个示例中不需要。
就
byte[]
数组而言,没什么,StreamWriter
确实引入了其他更有用的方法,尽管可以处理其他类型。
源如何与流连接