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());
}
}
}