StreamWriter 相关知识分享

简介: StreamWriter 相关知识分享

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


一、TextWriter


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


下面是TextWriter的构造函数:

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

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

IFomatProvider接口的简单介绍

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

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

//有关数字格式化隐性使用IFomatProvider的例子
  #if true
              //货币
               //十进制
              Console.WriteLine("显示货币十进制格式{0:d10}", 12);
              //科学计数法
              Console.WriteLine("科学计数法{0:e5}",12);
              //固定点格式
             Console.WriteLine("固定点格式 {0:f10}",12);1             
             //常规格式
             Console.WriteLine("常规格式{0:g10}",12);
             //数字格式(用分号隔开)
             Console.WriteLine("数字格式 {0:n5}:",666666666);
             //百分号格式
             Console.WriteLine("百分号格式(不保留小数){0:p0}",0.55);
             //16进制
             Console.WriteLine("16进制{0:x0}", 12);
            // 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 = 10;
              //注意:我们可以使用C+数字形式来改变provider提供的格式
              Console.WriteLine(string.Format(numberFomatProvider, "provider设置的货币格式{0:C}", 12));
             Console.WriteLine(string.Format(numberFomatProvider, "provider设置的货币格式被更改了:{0:C2}", 12));
             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, 20))
                  {
                      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就介绍到这里了。非常感谢 逆时针の风 的博客对我的帮助

相关文章
|
11月前
|
存储 Java C++
Java数组:静态初始化与动态初始化详解
本文介绍了Java中数组的定义、特点及初始化方式。
838 12
|
10月前
|
人工智能 自然语言处理 测试技术
Goedel-Prover:专为自动化数学问题的形式证明生成而设计的 LLM,快速解决形式化数学问题
Goedel-Prover 是一款由普林斯顿大学和清华大学等机构联合推出的开源模型,专注于自动化数学问题的形式证明生成。它通过将自然语言数学问题翻译成形式语言(如 Lean 4),显著提升了数学问题的证明效率。
507 4
Goedel-Prover:专为自动化数学问题的形式证明生成而设计的 LLM,快速解决形式化数学问题
|
10月前
|
SQL 存储 算法
sql server加密算法加盐
通过在 SQL Server 中结合使用加盐和哈希,可以有效地增强密码的安全性。本文详细介绍了在 SQL Server 中如何实现密码加盐和哈希的步骤,以及相关的完整示例和注意事项。希望本文能帮助读者更好地理解和应用加密技术,提升数据库系统的安
349 7
|
9月前
|
人工智能 自然语言处理 算法
HippoRAG 2:开源RAG框架革新知识检索,多跳推理+持续学习全搞定
HippoRAG 2 是俄亥俄州立大学推出的检索增强生成框架,通过个性化PageRank算法和知识图谱技术,显著提升了RAG系统在复杂问答任务中的表现。
1306 2
HippoRAG 2:开源RAG框架革新知识检索,多跳推理+持续学习全搞定
|
安全 网络协议 数据安全/隐私保护
Windows Server 2019 搭建并加入域
Windows Server 2019 搭建并加入域
519 0
|
9月前
|
安全 Java API
Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步
Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步
269 0
|
前端开发 JavaScript API
electron多标签页模式更像客户端
electron多标签页模式更像客户端
908 7
electron多标签页模式更像客户端
|
存储 人工智能 安全
OSS 深度解析:Data + AI 时代的对象存储
在 Data + AI 时代,随着大数据分析和 AI/ML 工作负载的进一步融合,对象存储 OSS 作为面向 AI 时代的数据基础设施,迎来了新的挑战与创新机遇。本话题我们将会介绍对象存储的能力创新,深度解读对象存储在实现稳定、安全、高性能和低成本背后的技术进展,并展望未来 AI 驱动趋势下的技术发展方向。
1805 2
|
XML 前端开发 Android开发
Kotlin教程笔记(80) - MVVM架构设计
本系列学习教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin语法的读者,建议参考“简洁”系列教程。本文重点介绍了Kotlin实现MVVM架构的设计思路和代码实现,包括Model、ViewModel和View层的具体实现,以及如何通过LiveData和viewModelScope有效管理数据和内存,避免内存泄漏。此外,还讨论了MVVM架构的常见缺点及应对策略,帮助开发者在实际项目中更好地应用这一设计模式。
261 1
|
SQL JSON 搜索推荐
java操作ElasticSearch(包含增删改查及基础语法操作)(一)
java操作ElasticSearch(包含增删改查及基础语法操作)
531 0
java操作ElasticSearch(包含增删改查及基础语法操作)(一)