• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > Stream.Write 与 StreamWriter.Write 的不同

Stream.Write 与 StreamWriter.Write 的不同

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了streamwriter.write,stream write error,stream.write,ofstream write,c streamwrite等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、测试方法是否结果相同
首先看下面两段代码1是StreamWriter.Write 2是Stream.Write:


1

2

上面我们可以看到StreamWriter.Write的可读性更好一些。

但是这两段代码执行后的ms是否是相同的结果呢?

首先我们来看下长度吧,在代码最后分别加上

各位看官,看到这里有何想法?

二、深究原因
下面继续深究一下这个多出来的3个字节

在方法后面都加上如下一段代码将MemoryStream的内容以十六进制的形式打印出来

 

这里我们发现用StreamWriter.Write输出多出了EF BB BF这3个字节

Google一下:多出来的这个玩意是 字节顺序记号(英语:byte-order mark,BOM)

在维基百科中可以查到:

编码 表示 (十六进制) 表示 (十进制)
UTF-8 EF BB BF 239 187 191
UTF-16(大端序) FE FF 254 255
UTF-16(小端序) FF FE 255 254
UTF-32(大端序) 00 00 FE FF 0 0 254 255
UTF-32(小端序) FF FE 00 00 255 254 0 0
UTF-7 2B 2F 76和以下的一个字节:[ 38 | 39 | 2B | 2F ] 43 47 118和以下的一个字节:[ 56 | 57 | 43 | 47 ]
en:UTF-1 F7 64 4C 247 100 76
en:UTF-EBCDIC DD 73 66 73 221 115 102 115
en:Standard Compression Scheme for Unicode 0E FE FF 14 254 255
en:BOCU-1 FB EE 28 及可能跟随着FF 251 238 40 及可能跟随着255

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的功能。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#使用StreamWriter写入文件的方法
  • C#使用Streamwriter打开文件的方法
  • Stream.Write 与 StreamWriter.Write 的不同

相关文章

  • 2017-05-28WinForm生成验证码图片的方法
  • 2017-05-28WPF设置窗体可以使用鼠标拖动大小的方法
  • 2017-05-28C#中判断某类型是否可以进行隐式类型转换
  • 2017-05-28C#3.0中Lambda表达式详解
  • 2017-05-28C# web应用程序不能访问app_code下类的原因以及解决方法
  • 2017-05-28C#使用Aspose.Cells控件读取Excel
  • 2017-05-28C#中使用IFormattable实现自定义格式化字符串输出示例
  • 2017-05-28C#逐行读取txt文件的方法
  • 2017-05-28C#中跨线程访问控件问题解决方案分享
  • 2017-05-28.net从服务器下载文件中文名乱码解决方案

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#中系统时间和UNIX时间戳互相转换
    • C#中foreach语句使用break暂停遍历的方法
    • C#实现两接口中同名方法实例分析
    • C#递归算法之分而治之策略
    • C#实现把彩色图片灰度化代码分享
    • C#中调用VB中Inputbox类的实现方法
    • C#实现获取鼠标句柄的方法
    • C# 6.0的属性(Property)的语法与初始值详解
    • c#封装百度web服务geocoding api 、百度坐标转换示例
    • C#中is与as的区别分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有