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

问题描述 投票:0回答:5

实例化

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 的直接依赖,但我不确定这有什么大不了的。 如果有的话,有什么区别?

c# memorystream streamwriter
5个回答
19
投票

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

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

实际上可能只是

sw.Write(value);

使用 StreamWriter.Write(string) 重载。


2
投票

一个区别是

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);

1
投票

StreamWriter 是 Stream 的超类,它实现了 TextWriter 以更轻松地处理文本。但由于它是一个超类,因此除了文本处理方法之外,它还具有所有相同的方法。这就是为什么您在第一个示例中需要 Encoding.Default.GetBytes(value) 而在第二个示例中不需要。


1
投票

byte[]
数组而言,没什么,
StreamWriter
确实引入了其他更有用的方法,尽管可以处理其他类型。


0
投票

源如何与流连接

© www.soinside.com 2019 - 2024. All rights reserved.