17

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,但我不确定这是否很重要。有什么区别,如果有的话?

4

4 回答 4

19

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

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

实际上可能只是

sw.Write(value);

使用 StreamWriter.Write(string) 重载。

于 2010-05-21T12:57:11.883 回答
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);
于 2018-04-18T08:18:28.870 回答
1

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

于 2010-05-21T12:57:32.950 回答
1

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

于 2010-05-21T12:59:37.110 回答