Stream.Write 与 StreamWriter.Write 的不同
来源:互联网 发布:iphone一键越狱软件 编辑:程序博客网 时间:2024/06/05 01:10
Stream.Write 与 StreamWriter.Write 是我们在向流中写数据时,最常用的方法。下面就详细讲解这两个方法。
一、测试方法是否结果相同
首先看下面两段代码1是StreamWriter.Write 2是Stream.Write:
1代码如下:
Stream ms = new MemoryStream();
string str = "这是测试字符串";
StreamWriter sw = new StreamWriter(ms, Encoding.UTF8);
sw.Write(str);
sw.Flush();
2 代码如下:
Stream ms = new MemoryStream();
string str = "这是测试字符串";
byte[] buffer = Encoding.UTF8.GetBytes(str);
ms.Write(buffer, 0, buffer.Length);
ms.Flush();
上面我们可以看到StreamWriter.Write的可读性更好一些。
但是这两段代码执行后的ms是否是相同的结果呢?
首先我们来看下长度吧,在代码最后分别加上
代码如下:
Console.WriteLine("StreamWriter.Write:{0}", ms.Length);
Console.WriteLine("Stream.Write:{0}", ms.Length);
执行后结果如下:
各位看官,看到这里有何想法?
二、深究原因
下面继续深究一下这个多出来的3个字节
在方法后面都加上如下一段代码将MemoryStream的内容以十六进制的形式打印出来
代码如下:
ms.Position = 0;
byte[] bytes = new byte[ms.Length];
ms.Read(bytes, 0, bytes.Length);
foreach (var item in bytes){
Console.Write(item.ToString("X2") + " ");
}
Console.WriteLine(String.Empty);
再次执行结果如下:
这里我们发现用StreamWriter.Write输出多出了EF BB BF这3个字节
Google一下:多出来的这个玩意是 字节顺序记号(英语:byte-order mark,BOM)
在维基百科中可以查到:
ok,了解了这个东西后我们就就需要知道在StreamWriter.Write中能否用代码控制不输出这个BOM吗?
三、查找解决办法
开始反编译StreamWriter.Write这个方法:
大致猜测是红色方框的代码输出了BOM信息,ok再进去看:
果然在这里,看上图红框处,GetPreamble方法是获取编码的字节序列,和我们之前查到的信息完全一致。
好下面继续找这个haveWrittenPreamble有没设置的可能,在Init方法中找到了它的身影。
杯具了,CanSeed没有set方法,Write之前的Position肯定为0,至此结束。
四、结论
由上面的结论,我们可以确定:
1.如果双方协议无BOM时,可以使用Stream.Write方法来输出,或者使用StreamWriter.Write时加入new UTF8Encoding(false)参数。
2.有BOM时,我们可以通过GetPreamble和Stream.Write来完成StreamWriter.Write的功能。
- Stream.Write 与 StreamWriter.Write 的不同
- FileStream、Stream 的 Read 与 Write 的工作原理浅谈
- Stream.Write 方法
- WRITE,ALV与FORM不同的输出方式
- .write()与innerHTML的区别
- console.write 与response.write
- write
- WRITE
- write
- write()
- write
- write
- write
- write
- nand write 与nand write.jaffs的区别
- uboot 中nand write 与nand write.yaffs的区别
- Arduino中Serial.read()与Serial.write()关于数字的不同处理
- Serialize / Stream (Read/Write) Configuration Settings
- 【STL】<algorithm><numeric><functional> 中的常用算法
- Android中的Handler
- 最小生成树
- HTML(3)
- 自定义标签与spring注入
- Stream.Write 与 StreamWriter.Write 的不同
- 网页计算器(javascript脚本)
- CF 240 D. Mashmokh and ACM
- JNDI 是什么
- 用DetachedCriteria查询
- php文件管理工具——RESPONSIVE filemanager
- (3)jmock测试入门
- DES算法实现(C++版)
- jq select操作