您的位置: 网站首页 > 程序开发 > C#程序设计 > 第9章 文件操作 > 【9.2 流】

9.2 流

 

流是.NET操作文件的基本类。.NET中对文件的输入输出工作都要用到流。流分为输入流和输出流。通常,输入流用于读取数据,最常见的输入流是键盘。此前应用的大部分输入都是来源于键盘,其实输入流可以来源于很多设备,本章主要讨论的输入流形式是磁盘文件。输出流则用于向外部目标写数据,本章讨论的输出流形式也仅限于磁盘文件。

9.2.1  流操作类介绍

.NET Framework中提供了5种常见的流操作类,用以提供文件的读取、写入等常见操作。类的简单说明如表9-2所示。

9-2  流操作类简单说明

   

BinaryReader

用特定的编码将基元数据类型读作二进制值

BinaryWriter

以二进制形式将基元类型写入流,并支持用特定的编码写入字符串

FileStream

公开以文件为主的Stream,既支持同步读写操作,也支持异步读写操作

StreamReader

实现一个TextReader,使其以一种特定的编码从字节流中读取字符

StreamWriter

实现一个TextWriter,使其以一种特定的编码向流中写入字符

下面将会对这些类进行讲解。

9.2.2  文件流类FileStream

文件流类FileStream公开了以文件为主的Stream,既支持同步读写操作,也支持异步读写操作。FileStream类的特点是操作字节和字节数组。这种方式不适合以字符数据构成的文本文件等类似文件的操作,但对随机文件操作等比较有效。FileStream类提供了对文件的低级而复杂的操作,但却可以实现更多高级的功能。下面介绍一个实例,演示如何使用FileStream对文件进行写入操作。

1.目的说明

创建一个Windows控制台应用程序,演示如何使用FileStream对文件进行写入操作。

2.实现步骤

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.txtFileStream对象

        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!");

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图9-5所示。

4.代码分析

代码中首先给出了文件夹的路径,利用Write方法向文件写入了部分字符串。查看写入的文件如图9-6所示。

           

9-5  运行结果1                                9-6  运行结果2

FileStream还可以实现读取的功能,下面通过一个实例演示FileStream的读取功能。

1.目的说明

创建一个Windows控制台应用程序,演示如何使用FileStream对文件进行读取操作。

2.实现步骤

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.txtFileStream对象

        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  运行结果

 

    Console.WriteLine(m_cDataRead);

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图9-7所示。

4.代码分析

代码中首先给出了文件夹的路径,利用Read方法从文件中读取了部分字符串。

9.2.3  流写入类StreamWriter

应用FileStream类需要许多额外的数据类型转换操作,十分影响效率。本小节将会介绍另外一种更为简单实用的写入方法即StreamWriter类。StreamWriter类允许直接将字符和字符串写入文件。下面介绍一个实例,演示StreamWriter的使用方法。

1.目的说明

创建一个Windows控制台应用程序,演示如何使用StreamWriter对文件进行写入操作。

2.实现步骤

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("成功写入!");

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图9-8所示。

4.代码分析

代码中首先给出了文件夹的路径,利用WriteLine方法向文件中写入了部分字符串。查看该文件,如图9-9所示。

            

9-8  运行结果                                  9-9  运行结果

9.2.4  流读取类StreamReader

相对于StreamWriter类,StreamReader类提供了另一种从文件中读取数据的方法。StreamReader类的应用方式非常相似于StreamWriter类。下面介绍一个实例,使用StreamReader类读取文件中的内容。

1.目的说明

创建一个Windows控制台应用程序,演示如何使用StreamWriter对文件进行写入操作。

2.实现步骤

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  运行结果

 

        Console.WriteLine(ex.Message);

    }

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图9-10所示。

4.代码分析

代码中首先给出了文件夹的路径,利用StreamReader类的ReadToEnd方法从文件中读取了所有字符串。

9.2.5  二进制流写入类BinaryWriter

BinaryWriter类是除了FileStreamStreamWriter之外的另一种向文件写入数据的方式。与前两种方式不同,BinaryWriter类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。下面介绍一个实例,演示使用二进制流写入类的使用方法。

1.目的说明

创建一个Windows控制台应用程序,演示如何使用BinaryWriter对文件进行写入操作。

2.实现步骤

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("写入成功!");

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图9-11所示。

9-11  运行结果

4.代码分析

代码中首先给出了文件夹的路径,利用BinaryWriter类的Write方法向文件中写入了部分二进制字符。创建的data.dat文件,如图9-12所示。该文件是以二进制存储的,因此用记事本打开时将无法观察到正确的字符。必须使用支持二进制的文本阅读器,如图9-13所示。

  

9-12  运行结果                       9-13  使用WinHex查看文件内容

9.2.6  二进制流读取类BinaryReader

BinaryReader类是和BinaryWriter类相对应的二进制数据读取类。BinaryReader类用特定的编码将基元数据类型读作二进制值。其应用方法与BinaryWriter大致相同。

1.目的说明

创建一个Windows控制台应用程序,演示如何使用BinaryReader对文件进行写入操作。

2.实现步骤

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

}

3.运行结果

Ctrl+F5组合键运行程序,运行结果如图9-14所示。

9-14  运行结果

4.代码分析

代码中首先给出了文件夹的路径,利用BinaryReader类的ReadInt32方法从文件中读取了所有二进制字符,并将其读为整型数值,便于输出。