在介绍StreamWriter之前,我们首先来了解一下它的父类TextWriter。

一、TextWriter

1、TextWriter的构造函数和常用属性方法

下面是TextWriter的构造函数:

和所有抽象类一样,该类不能直接实例化,它有两个构造函数。

特别说一下第二个构造函数,大家发现这个构造函数中有一个类型IFomatProvider类型的参数,这个是什么东东呢?

IFomatProvider接口的简单介绍

其实,IFomatProvider接口从字面上就能理解了,一个格式化的提供者。大家记得我们常用的string.Format("{0:P}",data);么?IFomatProvider在这里被隐式调用了。

关于隐式调用的各种方式,用个简单的例子向大家说明一下:

 //有关数字格式化隐性使用IFomatProvider的例子
#if true
//货币
Console.WriteLine(string.Format("显示货币格式{0:c3}",));
//十进制
Console.WriteLine("显示货币十进制格式{0:d10}", );
//科学计数法
Console.WriteLine("科学计数法{0:e5}",);
//固定点格式
Console.WriteLine("固定点格式 {0:f10}",);
//常规格式
Console.WriteLine("常规格式{0:g10}",);
//数字格式(用分号隔开)
Console.WriteLine("数字格式 {0:n5}:",);
//百分号格式
Console.WriteLine("百分号格式(不保留小数){0:p0}",0.55);
//16进制
Console.WriteLine("16进制{0:x0}", );
// 0定位器 此示例保留5位小数,如果小数部分小于5位,用0填充
Console.WriteLine("0定位器{0:000.00000}",1222.133);
//数字定位器
Console.WriteLine("数字定位器{0:(#).###}", 0200.0233000);
//小数
Console.WriteLine("小数保留一位{0:0.0}", 12.222);
//百分号的另一种写法,注意小数的四舍五入
Console.WriteLine("百分号的另一种写法,注意小数的四舍五入{0:0%.00}", 0.12345);
Console.WriteLine("\n\n");
#endif

输出结果:

也就是说IFomatProvider提供了一个格式化的工具,让我们通过NumberFomatInfo类来了解一下

这个密封类实现了IFomatProvider接口,主要实现了一个数字格式化的类,下面是一些规定的格式化说明符:

让我们用简单易懂的代码来实现NumberFomatInfo如何使用:

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

输出结果:

正如上述代码表示的,IFormatProvider提供用于检索控制格式化的对象的机制,我们甚至可以自定义Provider类来实现特殊的字符串格式化,关于这个重要的知识点,我会在另外一篇博文中详细介绍并自定义一个简单的FomatInfo类。

言归正传,让我们了解一下TextWriter的几个重要属性

TextWriter重要属性:

(1)、Encoding:可以获得当前TextWriter的Encoding

(2)、FomatProvider:可以获得当前TextWriter的FomatProvider

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

TextWriter重要方法:

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

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

(3)、Flush():和Stream类中一样,将缓冲区所有的数据立刻写入文件(基础设备)

(4)、Write():方法的重载(这个方法重载太多,所以这里不全写出了,大家可以参考最后一个例子,打印结果)

(5)、WriteLine():方法的重载,和Write()方法相比,区别在于每个重载执行完毕之后都会附加写入一个换行符

二、StreamWriter

首先我们先了解一下StreamWriter的概念:实现一个TextWriter,使其以一种特定的编码向流中写入字符。

那会有很多朋友疑惑,StreamWriter和TextWriter有什么区别呢?

其实从名字定义我们便可区别了,TextWriter分别是对连续字符系列处理的编写器,而StreamWriter通过特定的编码和流的方式对数据进行处理的编写器。

1、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的缓冲区的大小

2、SteamWriter的属性

StreamWriter的方法大多都继承了TextWriter这里就不再重复叙述了,这里就简单介绍一下StreamWriter独有的属性:

(1)、AutoFlush:这个值来指示每次使用Write()方法后直接将缓冲区的数据写入文件(基础流)

(2)、BaseStream:和StreamReader相似,可以取出当前的Stream对象加以处理

三、StreamWriter示例:

下面我们就简单的几个示例来看一下以上的属性方法如何使用的:

 const string txtFilePath = "D:\\TextWriter.txt";

         static void Main(string[] args)
{ NumberFormatInfo numberFomatProvider = new NumberFormatInfo();
//将小数 “.”换成"?"
numberFomatProvider.PercentDecimalSeparator = "?";
StreamWriterTest test = new StreamWriterTest(Encoding.Default, txtFilePath, numberFomatProvider);
//StreamWriter
test.WriteSomthingToFile();
//TextWriter
test.WriteSomthingToFileByUsingTextWriter();
Console.ReadLine();
}
} /// <summary>
/// TextWriter和StreamWriter的举例
/// </summary>
public class StreamWriterTest
{
/// <summary>
/// 编码
/// </summary>
private Encoding _encoding; /// <summary>
/// IFomatProvider
/// </summary>
private IFormatProvider _provider; /// <summary>
/// 文件路径
/// </summary>
private string _textFilePath; public StreamWriterTest(Encoding encoding, string textFilePath)
: this(encoding, textFilePath, null)
{ } public StreamWriterTest(Encoding encoding, string textFilePath, IFormatProvider provider)
{
this._encoding = encoding;
this._textFilePath = textFilePath;
this._provider = provider;
} /// <summary>
/// 我们可以通过FileStream 或者 文件路径直接对该文件进行写操作
/// </summary>
public void WriteSomthingToFile()
{
//获取FileStream
using (FileStream stream = File.OpenWrite(_textFilePath))
{
//获取StreamWriter
using (StreamWriter writer = new StreamWriter(stream, this._encoding))
{
this.WriteSomthingToFile(writer);
} //也可以通过文件路径和设置bool append,编码和缓冲区来构建一个StreamWriter对象
using (StreamWriter writer = new StreamWriter(_textFilePath, true, this._encoding, ))
{
this.WriteSomthingToFile(writer);
}
}
} /// <summary>
/// 具体写入文件的逻辑
/// </summary>
/// <param name="writer">StreamWriter对象</param>
public void WriteSomthingToFile(StreamWriter writer)
{
//需要写入的数据
string[] writeMethodOverloadType =
{
"1.Write(bool);",
"2.Write(char);",
"3.Write(Char[])",
"4.Write(Decimal)",
"5.Write(Double)",
"6.Write(Int32)",
"7.Write(Int64)",
"8.Write(Object)",
"9.Write(Char[])",
"10.Write(Single)",
"11.Write(Char[])",
"12.Write(String)",
"13Write(UInt32)",
"14.Write(string format,obj)",
"15.Write(Char[])"
}; //定义writer的AutoFlush属性,如果定义了该属性,就不必使用writer.Flush方法
writer.AutoFlush = true;
writer.WriteLine("这个StreamWriter使用了{0}编码", writer.Encoding.HeaderName);
//这里重新定位流的位置会导致一系列的问题
//writer.BaseStream.Seek(1, SeekOrigin.Current);
writer.WriteLine("这里简单演示下StreamWriter.Writer方法的各种重载版本"); writeMethodOverloadType.ToList().ForEach
(
(name) => { writer.WriteLine(name); }
);
writer.WriteLine("StreamWriter.WriteLine()方法就是在加上行结束符,其余和上述方法是用一致");
//writer.Flush();
writer.Close();
} public void WriteSomthingToFileByUsingTextWriter()
{
using (TextWriter writer = new StringWriter(_provider))
{
writer.WriteLine("这里简单介绍下TextWriter 怎么使用用户设置的IFomatProvider,假设用户设置了NumberFormatInfoz.PercentDecimalSeparator属性");
writer.WriteLine("看下区别吧 {0:p10}", 0.12);
Console.WriteLine(writer.ToString());
writer.Flush();
writer.Close();
} }
}

输出结果:

TextWriter输出结果:

好了,这次的StreamWriter就介绍到这里了。非常感谢 逆时针の风 的博客对我的帮助

StreamWriter 相关知识分享的更多相关文章

  1. FileStream相关知识分享

    一.如何理解FIleStream 通过前3章的学些,相信大家对于Stream已经有一定的了解,但是又如何去理解FileStream呢?请看下图: 我们磁盘中的任何文件都是通过二进制数组组成,最为直观的 ...

  2. MemoryStream相关知识分享

    一.简单介绍一下MemoryStream MemoryStream是内存流,为系统内存提供读写操作,由于MemoryStream是通过无符号字节数组组成的,可以说MemoryStream的性能可以算比 ...

  3. 【Stream—6】BufferedStream相关知识分享

    一.简单介绍以下BufferedStream 在前几章的讲述中,我们已经能够掌握流的基本特性和特点,一般进行对流的处理时,系统肩负着IO所带来的开销,调用十分频繁,这时候就应该想个办法减少这种开销,而 ...

  4. 【Stream—7】NetworkStream相关知识分享

    一.NetworkStream的作用 和先前的流有所不同,NetworkStream的特殊性可以在它的命名空间中得以了解(System.Net.Sockets),聪明的你马上就会反应过来:既然是在网络 ...

  5. XML的相关基础知识分享(二)

    前面我们讲了一下XML相关的基础知识(一),下面我们在加深一下,看一下XML高级方面. 一.命名空间 1.命名冲突 XML命名空间提供避免元素冲突的方法. 命名冲突:在XML中,元素名称是由开发者定义 ...

  6. XML的相关基础知识分享

    XML和Json是两种最常用的在网络中数据传输的数据序列化格式,随着时代的变迁,XML序列化用于网络传输也逐渐被Json取代,前几天,单位系统集成开发对接接口时,发现大部分都用的WebService技 ...

  7. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  8. 分享吉林大学机械科学与工程学院,zhao jun 博士的Halcon学习过程及知识分享

    分享吉林大学机械科学与工程学院,zhao jun 博士的Halcon学习过程及知识分享 全文转载zhao jun 博士的新浪博客,版权为zhaojun博士所有 原文地址:http://blog.sin ...

  9. JS作用域相关知识(#精)

    在学习<你不知道的JS>一书中,特将作用域相关知识在此分享一下: #说到作用域,就不得不提到LHS查询和RHS查询: 1)如果查询目的是对变量进行赋值,则使用LHS查询 2)如果查询目的是 ...

随机推荐

  1. OAuth2.0摘要

    一.简介 不使用oauth2.0协议,资源所有者直接给需要使用资源的第三方应用共享凭据时,有这些问题: 需要直接共享给第三方应用凭据 需要服务器支持密码身份验证 凭据的访问权限过大,失去对访问时间和范 ...

  2. 【linux】【Go】Centos7安装go1.13环境

    前言     Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言. 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pi ...

  3. JavaScript DOM 编程艺术

    最近把JavaScript DOM 编程艺术这本书看完了,觉得这本书很好 深入浅出地展示了渐进增强.平稳退化.结构和样式分离等编程思想,我对书中重要的知识进行了梳理总结. 一.网页 二.JavaScr ...

  4. 23种设计模式之适配器模式(Adapter Pattern)

    适配 即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口.例如:二转换为三箱插头,将高电压转换为低电压等. 动机(Motivate):    在软件系统中,由于应用环境的变化,常常需要将“ ...

  5. Spring 梳理 - View - JSON and XML View

    实际案例json <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...

  6. .Net Core自动化部署系列(一):Jenkins + GitLab

    项目进行微服化改造后系统发布就变得愈为重要,因为持续集成导致部署变得越来越频繁,人工部署带来的一些问题日渐凸显,大家可能都有被系统部署线问题困扰过的经历. 本篇我们将会使用Jenkins+Gitlab ...

  7. JavaSE----03.数据类型

    03.数据类型 1.数据类型分类     Java是强类型语言,Java中的数据类型分为两大类,分别是基本数据类型和引用数据类型.其中,基本数据类型由Java语言定义,其数据占用内存的大小固定,在内存 ...

  8. 学Python的第一天

    第一天学习笔记 一.安装typroa 下载软件typroa用于日常学习笔记记录,该软件支持markdown语法 步骤: 官网地址:https://typora.io/ 选择版本安装(以windows为 ...

  9. CSS ellipsis 与 padding 结合时的问题

    CSS 实现的文本截断 考察如下代码实现文本超出自动截断的样式代码: .truncate-text-4 { overflow: hidden; text-overflow: ellipsis; dis ...

  10. IP的分类以及子网划分、网络设置

    前言 整个因特网就是一个单一的.抽象的的网络.IP地址就是给因特网上的每一个主机(或路由器)的每一个接口分配一个在全世界范围是唯一的32位的标识符.IP地址的结构使我们可以在因特网上很方便的进行寻址. ...