【问题标题】:What is the difference between calling Stream.Write and using a StreamWriter?调用 Stream.Write 和使用 StreamWriter 有什么区别?
【发布时间】:2011-02-22 08:30:44
【问题描述】:

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


    【解决方案1】:

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

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

    实际上可能只是

    sw.Write(value);
    

    使用 StreamWriter.Write(string) 重载。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • StreamWriter 来自 TextWriter,而不是 Stream。说 StreamWriter 是 Streams 和 TextWriters 之间的适配器是正确的。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2021-06-18
          • 2013-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-01
          • 1970-01-01
          相关资源
          最近更新 更多