流是.NET操作文件的基本类。.NET中对文件的输入输出工作都要用到流。流分为输入流和输出流。通常,输入流用于读取数据,最常见的输入流是键盘。此前应用的大部分输入都是来源于键盘,其实输入流可以来源于很多设备,本章主要讨论的输入流形式是磁盘文件。输出流则用于向外部目标写数据,本章讨论的输出流形式也仅限于磁盘文件。
.NET Framework中提供了5种常见的流操作类,用以提供文件的读取、写入等常见操作。类的简单说明如表9-2所示。
表9-2 流操作类简单说明
类 |
说 明 |
BinaryReader |
用特定的编码将基元数据类型读作二进制值 |
BinaryWriter |
以二进制形式将基元类型写入流,并支持用特定的编码写入字符串 |
FileStream |
公开以文件为主的Stream,既支持同步读写操作,也支持异步读写操作 |
StreamReader |
实现一个TextReader,使其以一种特定的编码从字节流中读取字符 |
StreamWriter |
实现一个TextWriter,使其以一种特定的编码向流中写入字符 |
下面将会对这些类进行讲解。
文件流类FileStream公开了以文件为主的Stream,既支持同步读写操作,也支持异步读写操作。FileStream类的特点是操作字节和字节数组。这种方式不适合以字符数据构成的文本文件等类似文件的操作,但对随机文件操作等比较有效。FileStream类提供了对文件的低级而复杂的操作,但却可以实现更多高级的功能。下面介绍一个实例,演示如何使用FileStream对文件进行写入操作。
创建一个Windows控制台应用程序,演示如何使用FileStream对文件进行写入操作。
(1)创建一个名为FileStreamWirte的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
byte[] m_bDataWrite = new byte[100];
char[] m_cDataWrite = new char[100];
try
{
//创建C:\file.txt的FileStream对象
FileStream m_FileStream = new FileStream(@"C:\file.txt", FileMode.
OpenOrCreate);
//将要写入的字符串转换成字符数组
m_cDataWrite = "My First File Operation".ToCharArray();
//通过UTF-8编码方法将字符数组转换成字节数组
Encoder m_Enc = Encoding.UTF8.GetEncoder();
m_Enc.GetBytes(m_cDataWrite, 0, m_cDataWrite.Length, m_bDataWrite, 0,
true);
//设置流的当前位置为文件开始位置
m_FileStream.Seek(0, SeekOrigin.Begin);
//将字节数组中的内容写入文件
m_FileStream.Write(m_bDataWrite, 0, m_bDataWrite.Length);
}
catch (IOException ex)
{
Console.WriteLine("There is an IOException");
Console.WriteLine(ex.Message);
Console.ReadLine();
}
Console.WriteLine("Write to File Succeed!");
}
按Ctrl+F5组合键运行程序,运行结果如图9-5所示。
代码中首先给出了文件夹的路径,利用Write方法向文件写入了部分字符串。查看写入的文件如图9-6所示。
图9-5 运行结果1 图9-6 运行结果2
FileStream还可以实现读取的功能,下面通过一个实例演示FileStream的读取功能。
创建一个Windows控制台应用程序,演示如何使用FileStream对文件进行读取操作。
(1)创建一个名为FileStreamRead的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
byte[] m_bDataRead = new byte[100];
char[] m_cDataRead = new char[100];
try
{
//创建C:\file.txt的FileStream对象
FileStream m_FileStream=new FileStream(@"C:\file.txt", FileMode.Open);
//设置流的当前位置为文件开始位置
m_FileStream.Seek(0, SeekOrigin.Begin);
//将文件的内容读入入字节数组中
m_FileStream.Read(m_bDataRead, 0, 100);
}
catch (IOException ex)
{
Console.WriteLine("There is an IOException");
Console.WriteLine(ex.Message);
Console.ReadLine();
}
//通过UTF-8编码方法将字节数组转换成字符数组
Decoder m_Dec = Encoding.UTF8.GetDecoder();
m_Dec.GetChars(m_bDataRead, 0, m_bDataRead.Length, m_cDataRead, 0);
Console.WriteLine("Read From File Succed!");
图9-7 运行结果
|
}
按Ctrl+F5组合键运行程序,运行结果如图9-7所示。
代码中首先给出了文件夹的路径,利用Read方法从文件中读取了部分字符串。
应用FileStream类需要许多额外的数据类型转换操作,十分影响效率。本小节将会介绍另外一种更为简单实用的写入方法即StreamWriter类。StreamWriter类允许直接将字符和字符串写入文件。下面介绍一个实例,演示StreamWriter的使用方法。
创建一个Windows控制台应用程序,演示如何使用StreamWriter对文件进行写入操作。
(1)创建一个名为UseStreamWriter的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
try
{
//保留文件现有数据,以追加写入的方式打开C:\file.txt文件
StreamWriter m_SW = new StreamWriter(@"C:\file.txt", true);
//向文件写入新字符串,并关闭StreamWriter
m_SW.WriteLine("Another File Operation Method");
m_SW.Close();
}
catch (IOException ex)
{
Console.WriteLine("出现错误!");
Console.WriteLine(ex.Message);
}
Console.WriteLine("成功写入!");
}
按Ctrl+F5组合键运行程序,运行结果如图9-8所示。
代码中首先给出了文件夹的路径,利用WriteLine方法向文件中写入了部分字符串。查看该文件,如图9-9所示。
图9-8 运行结果 图9-9 运行结果
相对于StreamWriter类,StreamReader类提供了另一种从文件中读取数据的方法。StreamReader类的应用方式非常相似于StreamWriter类。下面介绍一个实例,使用StreamReader类读取文件中的内容。
创建一个Windows控制台应用程序,演示如何使用StreamWriter对文件进行写入操作。
(1)创建一个名为UseStreamWriter的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
try
{
//以绝对路径方式构造新的StreamReader对象
StreamReader m_SW = new StreamReader(@"C:\file.txt");
//用ReadToEnd方法将C:\file.txt中的数据全部读入字符串m_Data中,并关闭
StreamReader
string m_Data = m_SW.ReadToEnd();
Console.WriteLine(m_Data);
m_SW.Close();
}
catch (IOException ex)
{
Console.WriteLine("There is an IO exception!");
图9-10 运行结果
|
}
}
按Ctrl+F5组合键运行程序,运行结果如图9-10所示。
代码中首先给出了文件夹的路径,利用StreamReader类的ReadToEnd方法从文件中读取了所有字符串。
BinaryWriter类是除了FileStream和StreamWriter之外的另一种向文件写入数据的方式。与前两种方式不同,BinaryWriter类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。下面介绍一个实例,演示使用二进制流写入类的使用方法。
创建一个Windows控制台应用程序,演示如何使用BinaryWriter对文件进行写入操作。
(1)创建一个名为UseBinWrite的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
FileStream m_FS = new FileStream(@"C:\Data.dat", FileMode.Create);
//通过文件流创建相应的BinaryWriter
BinaryWriter m_BW = new BinaryWriter(m_FS);
for (int i = 0; i < 11; i++)
{
//向C:\Data.dat中写入数据
m_BW.Write((int)i);
}
m_BW.Close();
m_FS.Close();
Console.WriteLine("写入成功!");
}
按Ctrl+F5组合键运行程序,运行结果如图9-11所示。
图9-11 运行结果
代码中首先给出了文件夹的路径,利用BinaryWriter类的Write方法向文件中写入了部分二进制字符。创建的data.dat文件,如图9-12所示。该文件是以二进制存储的,因此用记事本打开时将无法观察到正确的字符。必须使用支持二进制的文本阅读器,如图9-13所示。
图9-12 运行结果 图9-13 使用WinHex查看文件内容
BinaryReader类是和BinaryWriter类相对应的二进制数据读取类。BinaryReader类用特定的编码将基元数据类型读作二进制值。其应用方法与BinaryWriter大致相同。
创建一个Windows控制台应用程序,演示如何使用BinaryReader对文件进行写入操作。
(1)创建一个名为UseBinRead的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
FileStream m_FS = new FileStream(@"C:\Data.dat", FileMode.Open, File-
Access.Read);
// 通过文件流创建相应的BinaryReader
BinaryReader m_BR = new BinaryReader(m_FS);
// 从C:\Data.dat中读取数据
for (int i = 0; i < 11; i++)
{
Console.WriteLine(m_BR.ReadInt32());
}
m_BR.Close();
m_FS.Close();
}
按Ctrl+F5组合键运行程序,运行结果如图9-14所示。
图9-14 运行结果
代码中首先给出了文件夹的路径,利用BinaryReader类的ReadInt32方法从文件中读取了所有二进制字符,并将其读为整型数值,便于输出。