C# 温故而知新:Stream篇(三)

TextWriter 和 StreamWriter

 

为什么介绍TextWriter?

就如上篇讲述的相同,对于首要的底蕴技术,大家必然要刨根问底,这样在面对以后或者很复杂的业务或技术时才能游刃有余,

甚至可以创新出新的化解方案,言归正传,想精晓StreamWriter
必须询问其大叔TextWriter的构造和行使方法。

那么微软为啥要创制立那一个抽象类呢?看下图

图片 1

   

确实可以这么领会C,C++
,XAML,Html一切可以写在文件上写的语言都可以用Text这些词在空虚,(千万别小看记事本,它才是元老啊),

聪明的您想到了,今后我们得以自定义一些投机Writer类来落实大家一定的写效率。现在我们只要知道TextWriter是一个浮泛的文件写入器,

可以在文书上写入大家想要的格式,可以经过微软派生类或着自定义派生类来已毕TextWriter的法力。只要您有丰硕的想象力就能在更新

出一个新的派生类。

 

 TextWriter的构造,常用属性和章程

以下是TextWriter构造函数:

和持有的抽象类一样,该类不可能直接实例化,它有2个构造函数

 图片 2

更加我想说下第一个构造函数,大家发现那几个社团有个IFomatProvider 类型的参数, 这几个是怎么着东东?

    

IFormatProvider接口的简约介绍

实际IFormatProvider接口 从字面上就能了解了,一个格式化的提供者

大家纪念大家常用的string.format(“{0:P}”,data);么? IFormatProvider在此处被隐式的调用了

至于隐式调用的各个方式,用个简单的事例向咱们表明下:

图片 3图片 4

 1 //有关数字格式化隐性使用IFomatProvider的例子
 2 #if true
 3             //货币
 4             Console.WriteLine(string.Format("显示货币格式{0:c3}",12));
 5             //十进制
 6             Console.WriteLine("显示货币十进制格式{0:d10}", 12);
 7             //科学计数法
 8             Console.WriteLine("科学计数法{0:e5}",12);
 9             //固定点格式
10             Console.WriteLine("固定点格式 {0:f10}",12);
11             //常规格式
12             Console.WriteLine("常规格式{0:g10}",12);
13             //数字格式(用分号隔开)
14             Console.WriteLine("数字格式 {0:n5}:",666666666);
15             //百分号格式
16             Console.WriteLine("百分号格式(不保留小数){0:p0}",0.55);
17             //16进制
18             Console.WriteLine("16进制{0:x0}", 12);
19            // 0定位器  此示例保留5位小数,如果小数部分小于5位,用0填充
20             Console.WriteLine("0定位器{0:000.00000}",1222.133);
21             //数字定位器
22             Console.WriteLine("数字定位器{0:(#).###}", 0200.0233000);
23              //小数
24             Console.WriteLine("小数保留一位{0:0.0}", 12.222);
25             //百分号的另一种写法,注意小数的四舍五入
26             Console.WriteLine("百分号的另一种写法,注意小数的四舍五入{0:0%.00}", 0.12345);
27             Console.WriteLine("\n\n");
28  #endif

View Code

 

也就是说IFormatProvider 提供了一个格式化的工具。

让大家经过NumberFormatInfo类来温故下:

图片 5

本条密封类落成了IFormatProvider接口,主要落成了一个数字格式化的类,上面是局地确定的格式表明符:

c、C

货币格式。关联的属性包括:

d、D

十进制格式。

e、E

科学计数(指数)格式。

f、F

固定点格式。

g、G

常规格式。

n、N

数字格式。

p、P

百分比格式。

                  让大家用简易易懂的代码来兑现下NumberFormatInfo
怎么着利用:

图片 6图片 7

 1 #if true
 2             //显性使用IFomatProvider
 3             Console.WriteLine("显性使用IFomatProvider的例子");
 4             //实例化numberFomatProvider对象
 5             NumberFormatInfo numberFomatProvider = new NumberFormatInfo();
 6             //设置该provider对于货币小数的显示长度
 7             numberFomatProvider.CurrencyDecimalDigits = 10;
 8             //注意:我们可以使用C+数字形式来改变provider提供的格式
 9             Console.WriteLine(string.Format(numberFomatProvider, "provider设置的货币格式{0:C}", 12));
10             Console.WriteLine(string.Format(numberFomatProvider, "provider设置的货币格式被更改了:{0:C2}", 12));
11             Console.WriteLine(string.Format(numberFomatProvider, "默认百分号和小数形式{0:p2}", 0.12));
12             //将小数 “.”换成"?" 
13              numberFomatProvider.PercentDecimalSeparator = "?";
14              Console.WriteLine(string.Format(numberFomatProvider, "provider设置的百分号和小数形式{0:p2}", 0.12));
15             Console.ReadLine();
16 #endif

View Code

 输出结果:

图片 8

                
正如上述代码所表示的,IFormatProvider提供用于检索控制格式化的对象的建制。大家居然足以自定义provider类来促成特殊的

                
字符串格式化,关于那一个至关主要的知识点我会在另一篇作品中详尽介绍并且自定义一个简单的FormatInfo类

 

言归正传让大家精晓下TextWriter的多少个重大性质

*1:Encoding: 可以获取当前TextWriter的Encoding

*2:FormatProvider: 可以取得当前TextWriter的IFormatProvider

*3:NewLine:
每当调用WriteLine()方法时,行终止符字符串都会写入到文本流中,该属性就是读取

 该终结符字符串

 

方法:

*1:Close():关闭TextWriter并且释放TextWriter的资源

*2:Dispose():
释放TextWriter所占有的保有资源(和StreamReader相似,一旦TextWriter被保释,它所占用的资源例如Stream会一并释放)

*3:Flush(): 和Stream类中千篇一律,将缓冲区所有数据立马写入文件(基础设备)

*4:Write()方法的重载(那个方法重载太多了,所以那里就不全写出了,我们可以参照最终一个例证的打印结果)

*5:WriteLine()方法的重载:和Write()方法比较分别在于每个重载执行完结之后会增大写入一个换行符

          

 

什么明白StreamWriter?

率先大家先精晓下StreamWriter的定义:完结一个 TextWriter.aspx),使其以一种特定的编码向流中写入字符。

那会有那几个朋友会纳闷,StreamWriter和TextWriter有哪些不一样?

其实从名字定义大家便可分别了,TextWriter分别是对连日字符连串处理的编写器,而StreamWriter通过一定的编码和流的办法对数据举行拍卖的编写器

StreamWriter的构造函数

*1:public StreamWriter(string path);

  参数path表示文件所在的职位

*2:public StreamWriter(Stream stream, Encoding encoding);

  参数Stream
表示能够承受stream的其余子类或派生类,Encoding表示让StreamWriter
在写操作时拔取该encoding举办编码操作

*3:public StreamWriter(string path, bool append);

 第三个append参数十分重大,当append参数为true时,StreamWriter会通过path去找当前文件是不是留存,若是存在则展开append或overwrite的操作,否则创设新的文书

*4:public StreamWriter(Stream stream, Encoding encoding, int
bufferSize);

bufferSize参数设置当前StreamWriter的缓冲区的分寸

        

StreamWriter的属性

StreamWriter的点子大多都无冕了TextWriter
那里就不在重复叙述了,那里就概括介绍下StreamWriter独有的品质

*1:AutoFlush.aspx):
那几个值来提醒每一次使用streamWriter.Write()方法后一向将缓冲区的数据写入文件(基础流)

*2:BaseStream.aspx):
和StreamReader相似可以取出当前的Stream对象加以处理

 

StreamWriter示例

图片 9图片 10

  1 const string txtFilePath = "D:\\TextWriter.txt";
  2 
  3         static void Main(string[] args)
  4         {
  5 
  6             NumberFormatInfo numberFomatProvider = new NumberFormatInfo();
  7             //将小数 “.”换成"?" 
  8             numberFomatProvider.PercentDecimalSeparator = "?";
  9             StreamWriterTest test = new StreamWriterTest(Encoding.Default, txtFilePath, numberFomatProvider);
 10             //StreamWriter
 11             test.WriteSomthingToFile();
 12             //TextWriter
 13             test.WriteSomthingToFileByUsingTextWriter();
 14             Console.ReadLine();
 15         }
 16     }
 17 
 18     /// <summary>
 19     ///  TextWriter和StreamWriter的举例
 20     /// </summary>
 21     public class StreamWriterTest
 22     {
 23         /// <summary>
 24         /// 编码
 25         /// </summary>
 26         private Encoding _encoding;
 27 
 28         /// <summary>
 29         /// IFomatProvider
 30         /// </summary>
 31         private IFormatProvider _provider;
 32 
 33         /// <summary>
 34         /// 文件路径
 35         /// </summary>
 36         private string _textFilePath;
 37 
 38 
 39         public StreamWriterTest(Encoding encoding, string textFilePath)
 40             : this(encoding, textFilePath, null)
 41         {
 42 
 43         }
 44 
 45         public StreamWriterTest(Encoding encoding, string textFilePath, IFormatProvider provider)
 46         {
 47             this._encoding = encoding;
 48             this._textFilePath = textFilePath;
 49             this._provider = provider;
 50         }
 51 
 52         /// <summary>
 53         ///  我们可以通过FileStream 或者 文件路径直接对该文件进行写操作
 54         /// </summary>
 55         public void WriteSomthingToFile()
 56         {
 57             //获取FileStream
 58             using (FileStream stream = File.OpenWrite(_textFilePath))
 59             {
 60                 //获取StreamWriter
 61                 using (StreamWriter writer = new StreamWriter(stream, this._encoding))
 62                 {
 63                     this.WriteSomthingToFile(writer);
 64                 }
 65 
 66                 //也可以通过文件路径和设置bool append,编码和缓冲区来构建一个StreamWriter对象
 67                 using (StreamWriter writer = new StreamWriter(_textFilePath, true, this._encoding, 20))
 68                 {
 69                     this.WriteSomthingToFile(writer);
 70                 }
 71             }
 72         }
 73 
 74         /// <summary>
 75         ///  具体写入文件的逻辑
 76         /// </summary>
 77         /// <param name="writer">StreamWriter对象</param>
 78         public void WriteSomthingToFile(StreamWriter writer)
 79         {
 80             //需要写入的数据
 81             string[] writeMethodOverloadType =
 82            {
 83               "1.Write(bool);",
 84               "2.Write(char);",
 85               "3.Write(Char[])",
 86               "4.Write(Decimal)",
 87               "5.Write(Double)",
 88               "6.Write(Int32)",
 89               "7.Write(Int64)",
 90               "8.Write(Object)",
 91               "9.Write(Char[])",
 92               "10.Write(Single)",
 93               "11.Write(Char[])",
 94               "12.Write(String)",
 95               "13Write(UInt32)",
 96               "14.Write(string format,obj)",
 97               "15.Write(Char[])"
 98            };
 99 
100             //定义writer的AutoFlush属性,如果定义了该属性,就不必使用writer.Flush方法
101             writer.AutoFlush = true;
102             writer.WriteLine("这个StreamWriter使用了{0}编码", writer.Encoding.HeaderName);
103             //这里重新定位流的位置会导致一系列的问题
104             //writer.BaseStream.Seek(1, SeekOrigin.Current);
105             writer.WriteLine("这里简单演示下StreamWriter.Writer方法的各种重载版本");
106 
107             writeMethodOverloadType.ToList().ForEach
108                 (
109                     (name) => { writer.WriteLine(name); }
110                 );
111             writer.WriteLine("StreamWriter.WriteLine()方法就是在加上行结束符,其余和上述方法是用一致");
112             //writer.Flush();
113             writer.Close();
114         }
115          
116         public void WriteSomthingToFileByUsingTextWriter()
117         {
118             using (TextWriter writer = new StringWriter(_provider))
119             {
120                 writer.WriteLine("这里简单介绍下TextWriter 怎么使用用户设置的IFomatProvider,假设用户设置了NumberFormatInfoz.PercentDecimalSeparator属性");
121                 writer.WriteLine("看下区别吧 {0:p10}", 0.12);
122                 Console.WriteLine(writer.ToString());
123                 writer.Flush();
124                 writer.Close();
125             }
126 
127         }
128     }

View Code

 

StreamWriter输出结果:

图片 11

TextWriter 输出结果

图片 12

深信不疑大家看完这几个示例后能对StreamWriter和TextWriter有一个更深的接头

 

本章计算

本章讲述了 TextWriter 和
StreamWriter的部分焦点的概念操作和分裂,还有稍稍介绍了IFomartProvider接口的骨干效率,

鉴于IFomartProvider也是分外重大的一个接口,我也会独自写一篇有关它的博文,至此关于流的部分备选工作已经成功,

下一章节将业内介绍Stream的子类,也是很要紧的FileStream类,谢谢我们援助!

 

 

文章来源:http://www.cnblogs.com/JimmyZheng/archive/2012/03/25/2416841.html

相关文章