StreamReader和StreamWriter类知识点

StreamWriter篇

一、StreamWriter 实现一个 TextWriter,使其以一种特定的编码向流中写入字符。
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class StreamWriter : TextWriter
StreamWriter 旨在以一种特定的编码输出字符,而从 Stream 派生的类则用于字节的输入和输出。

StreamWriter 默认使用 UTF8Encoding 的实例,除非指定了其他编码。构造 UTF8Encoding 的这个实例使得 Encoding.GetPreamble 方法返回以 UTF-8 格式编写的 Unicode 字节
顺序标记。当不再向现有流中追加时,编码的报头将被添加到流中。这表示使用 StreamWriter 创建的所有文本文件都将在其开头有三个字节顺序标记。UTF-8 可以正确处理所有
的 Unicode 字符并在操作系统的本地化版本上产生一致的结果。

默认情况下,StreamWriter 不是线程安全的。有关线程安全包装的信息,请参见 TextWriter.Synchronized。

二、公共构造函数
1、StreamWriter (Stream)  用 UTF-8 编码及默认缓冲区大小,为指定的流初始化 StreamWriter 类的一个新实例。
C#
public StreamWriter (
    Stream stream
)
参数
stream
要写入的流。

2、StreamWriter (String)  使用默认编码和缓冲区大小,为指定路径上的指定文件初始化 StreamWriter 类的新实例。
C#
public StreamWriter (
    string path
)
参数
path
要向其中写入的完整文件路径。path 可以是文件名。

三、公共属性
1、AutoFlush  获取或设置一个值,该值指示 StreamWriter 是否在每次调用 StreamWriter.Write 之后,将其缓冲区刷新到基础流。
public virtual bool AutoFlush { get; set; }
属性值
强制 StreamWriter 刷新其缓冲区时,为 true;否则,为 false。

备注
除非显式地调用 Flush 或 Close,否则,刷新流不会刷新其基础编码器。将 AutoFlush 设置为 true 意味着将数据从缓冲区刷新到流中,但不刷新编码器状态。这将允许编码器
保持其状态(不完全字符),以便它可以正确地对下一个字符块进行编码。此方案影响 UTF8 和 UTF7,这二者中,某些字符只能在编码器收到相邻的一个或多个字符后才能进行编
码。
当 AutoFlush 设置为 false 时,StreamWriter 将从传递进的编码做限量缓冲,这种缓冲以内部方式和潜在方式在编码器中进行。假设在使用 StreamWriter 写入时始终调用
Close(或者至少 Flush),那么将 AutoFlush 设置为 false 可能会获得更好的性能。
例如,如果用户期望您所写入的设备能够立即反馈,则将 AutoFlush 设置为 true。Console.Out 即属于这种情况:内部用于向 Console 写入的 StreamWriter 在您每次调用
StreamWriter.Write 后,都刷新其所有的内部状态,编码器状态除外。

四、公共方法
1、Close  已重写。 关闭当前的 StreamWriter 对象和基础流。 
public override void Close ()

备注:
此方法重写 Close。

Close 的此实现调用传递 true 值的 Dispose 方法。

必须调用 Close 以确保所有数据正确写出到基础流中。调用 Close 后,在 StreamWriter 上进行的任何操作都可能引发异常。如果磁盘上没有足够的空间,则调用 Close 将引发
异常。

除非显式地调用 Flush 或 Close,否则,刷新流不会刷新其基础编码器。将 AutoFlush 设置为 true 意味着将数据从缓冲区刷新到流中,但不刷新编码器状态。这将允许编码器
保持其状态(不完全字符),以便它可以正确地对下一个字符块进行编码。此方案影响 UTF8 和 UTF7,这二者中,某些字符只能在编码器收到相邻的一个或多个字符后才能进行编
码。

2、StreamWriter.Dispose ()  释放由此 TextWriter 对象使用的所有资源。
备注:
使用完 TextWriter 后调用 Dispose。Dispose 方法使 TextWriter 处于不可用状态。调用完 Dispose 后,必须释放对 TextWriter 的所有引用,这样垃圾回收器才能收回
TextWriter 占用的内存。

有关更多信息,请参见 清理非托管资源 和 实现 Dispose 方法。

注意   在释放上次对 TextWriter 的引用之前,应始终调用 Dispose。否则,在垃圾回收器调用 TextWriter 对象的 Finalize 方法之前,正在使用的资源不会被释放。

3、Flush  已重写。 清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流。
备注:
此方法重写 Flush。

除非显式地调用 Flush 或 Close,否则,刷新流不会刷新其基础编码器。将 AutoFlush 设置为 true 意味着将数据从缓冲区刷新到流中,但不刷新编码器状态。这将允许编码器
保持其状态(不完全字符),以便它可以正确地对下一个字符块进行编码。此方案影响 UTF8 和 UTF7,这二者中,某些字符只能在编码器收到相邻的一个或多个字符后才能进行编
码。

4、Synchronized (静态)  在指定 TextWriter 周围创建线程安全包装。 (从 TextWriter 继承。)
public static TextWriter Synchronized (
    TextWriter writer
)
参数:
writer
要同步的 TextWriter。

返回值
线程安全包装。

注意
应用于此方法的 HostProtectionAttribute 属性 (Attribute) 具有以下 Resources 属性 (Property) 值:Synchronization。HostProtectionAttribute 并不会影响桌面应用程
序(桌面应用程序通常通过双击图标、键入命令或在浏览器中输入 URL 来启动)。有关更多信息,请参见 HostProtectionAttribute 类或 SQL Server 编程和宿主保护属性。

对返回的包装的所有写入都将具有线程安全性。

5、Write  已重载。 写入流。 
StreamWriter.Write (Boolean)  将 Boolean 值的文本表示形式写入文本流。 
StreamWriter.Write (Char)  将字符写入流。
StreamWriter.Write (Char[])  将字符数组写入流。
StreamWriter.Write (Decimal)  将后面带有行结束符的十进制值的文本表示形式写入文本流。 
StreamWriter.Write (Double)  将 8 字节浮点值的文本表示形式写入文本流。 
StreamWriter.Write (Int32)  将 4 字节有符号整数的文本表示形式写入文本流。 
StreamWriter.Write (Int64)  将 8 字节有符号整数的文本表示形式写入文本流。 
StreamWriter.Write (Object)  通过在对象上调用 ToString 将此对象的文本表示形式写入文本流。 
StreamWriter.Write (Single)  将 4 字节浮点值的文本表示形式写入文本流。 
StreamWriter.Write (String)  将字符串写入流。

6、WriteLine   已重载。 写入重载参数指定的某些数据,后跟行结束符。 (从 TextWriter 继承。)
TextWriter.WriteLine ()  将行结束符写入文本流。
TextWriter.WriteLine (Boolean)  将后跟行结束符的 Boolean 的文本表示形式写入文本流。
TextWriter.WriteLine (Char)  将后跟行结束符的字符写入文本流。
TextWriter.WriteLine (Char[])  将后跟行结束符的字符数组写入文本流。
TextWriter.WriteLine (Decimal)  将后面带有行结束符的十进制值的文本表示形式写入文本流。
TextWriter.WriteLine (Double)  将后跟行结束符的 8 字节浮点值的文本表示形式写入文本流。
TextWriter.WriteLine (Int32)  将后跟行结束符的 4 字节有符号整数的文本表示形式写入文本流。
TextWriter.WriteLine (Int64)  将后跟行结束符的 8 字节有符号整数的文本表示形式写入文本流。
TextWriter.WriteLine (Object)  通过在对象上调用 ToString 将后跟行结束符的此对象的文本表示形式写入文本流。
TextWriter.WriteLine (Single)  将后跟行结束符的 4 字节浮点值的文本表示形式写入文本流。
TextWriter.WriteLine (String)  将后跟行结束符的字符串写入文本流。 

 

 

StreamReader篇

一、StreamReader 实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class StreamReader : TextReader
StreamReader 旨在以一种特定的编码输入字符,而 Stream 类用于字节的输入和输出。使用 StreamReader 读取标准文本文件的各行信息。

除非另外指定,StreamReader 的默认编码为 UTF-8,而不是当前系统的 ANSI 代码页。UTF-8 可以正确处理 Unicode 字符并在操作系统的本地化版本上提供一致的结果。

默认情况下,StreamReader 不是线程安全的。有关线程安全包装的信息,请参见 TextReader.Synchronized。

Read(Char[],Int32,Int32) 和 Write(Char[],Int32,Int32) 方法重载读取和写入 count 参数指定的字符数。这些区别于 BufferedStream.Read 和 BufferedStream.Write,后两
者读写由 count 参数指定的字节数。仅将 BufferedStream 方法用于读写字节数组元素的整型数。

注意
读取 Stream 时,使用大小与流的内部缓冲区相同的缓冲区会更有效。
二、 公共构造函数
StreamReader  已重载。为指定的流初始化 StreamReader 类的新实例。
1、StreamReader (Stream)  为指定的流初始化 StreamReader 类的新实例。
public StreamReader (
    Stream stream
)
参数
stream
要读取的流。
2、StreamReader (String)  为指定的文件名初始化 StreamReader 类的新实例。
public StreamReader (
    string path
)
参数
path
要读取的完整文件路径。

三、公共属性
1、BaseStream  返回基础流。
public virtual Stream BaseStream { get; }
StreamReader 可能缓冲输入,使得基础流的位置与 StreamReader 的位置不匹配。带 detectEncodingFromByteOrderMarks 参数的 StreamReader 构造函数可以在您第一次从
StreamReader 对象中读取时更改编码。

2、CurrentEncoding  获取当前 StreamReader 对象正在使用的当前字符编码。
属性值
当前读取器所使用的当前字符编码。第一次调用 StreamReader 的任何 Read 方法后,该值可能会不同,因为直到第一次调用 Read 方法时,才会进行编码的自动检测。

3、EndOfStream  获取一个值,该值表示当前的流位置是否在流的末尾。
public bool EndOfStream { get; }
如果当前的流位置在流的末尾,则为 true;否则为 false。

四、公共方法
1、Close  已重写。 关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。 
2、Dispose  已重载。 
3、Peek  已重写。 返回下一个可用的字符,但不使用它。
public override int Peek ()
下一个要读取的字符,或者如果没有更多的可用字符或此流不支持查找,则为 -1。
4、Read  已重载。 已重写。 读取输入流中的下一个字符或下一组字符。 
1)StreamReader.Read ()  读取输入流中的下一个字符并使该字符的位置提升一个字符。
public override int Read ()
返回值
输入流中表示为 Int32 对象的下一个字符。如果不再有可用的字符,则为 -1。
2)StreamReader.Read (Char[], Int32, Int32)  从 index 开始,从当前流中将最多的 count 个字符读入 buffer。 
ublic override int Read (
    [InAttribute] [OutAttribute] char[] buffer,
    int index,
    int count
)
参数
buffer
此方法返回时,包含指定的字符数组,该数组的 index 和 (index + count - 1) 之间的值由从当前源中读取的字符替换。
index
开始写入的 buffer 的索引。
count
最多读取的字符数。
返回值
已读取的字符数,或者如果已到达流的末尾并且未读取任何数据,则为 0。该数小于或等于 count 参数,具体取决于流中是否有可用的数据。

 

 

代码篇
msdn上的两个例子很不错(StreamReader.Read ()和StreamReader.Read (Char[], Int32, Int32))
using System;
using System.IO;

class Test
{
    public static void Main()
    {
        string path = @"c:\temp\MyTest.txt";

        try
        {
            if (File.Exists(path))
            {
                File.Delete(path);
            }

            using (StreamWriter sw = new StreamWriter(path)) //using语句请参考《using 知识点扩充》
            {
                sw.WriteLine("This");
                sw.WriteLine("is some text");
                sw.WriteLine("to test");
                sw.WriteLine("Reading");
            }

            using (StreamReader sr = new StreamReader(path))
            {
                while (sr.Peek() >= 0) //通过此方式,可实现读出来的文件完全按照原文件格式呈现在屏幕上
                {
                    Console.Write((char)sr.Read());
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("The process failed: {0}", e.ToString());
        }
    }
}

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        string path = @"c:\temp\MyTest.txt";

        try
        {
            if (File.Exists(path))
            {
                File.Delete(path);
            }

            using (StreamWriter sw = new StreamWriter(path))
            {
                sw.WriteLine("This");
                sw.WriteLine("is some text");
                sw.WriteLine("to test");
                sw.WriteLine("Reading");
            }

            using (StreamReader sr = new StreamReader(path))
            {
                //This is an arbitrary size for this example.
                char[] c = null;

                while (sr.Peek() >= 0)
                {
                    c = new char[5];//这是先读到缓冲内,再将缓冲内容呈现出来,不像上个例子不断读出下个字符,呈现出来
                    sr.Read(c, 0, c.Length);
                    //The output will look odd, because
                    //only five characters are read at a time.
                    Console.WriteLine(c);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("The process failed: {0}", e.ToString());
        }
    }
}

转载于:https://www.cnblogs.com/365up/archive/2009/10/03/1577741.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值