调用 Stream.Write 和使用 StreamWriter 有啥区别?
Posted
技术标签:
【中文标题】调用 Stream.Write 和使用 StreamWriter 有啥区别?【英文标题】: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,但我不确定这是否很重要。有什么区别,如果有的话?
【问题讨论】:
【参考方案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);
【讨论】:
以上是关于调用 Stream.Write 和使用 StreamWriter 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
使用内存映射文件或普通 Stream.Write 时是不是有任何持久性保证
Py4JJavaError:调用 o45.load 时出错。 :java.lang.NoClassDefFoundError:org/apache/spark/sql/sources/v2/Strea
出现:stream write error这个问题,后来怎么解决了,我现在也遇到这样,急死了,能告诉我怎么解决吗,真诚感谢