C#文件的读写

  在System.IO命名空间中提供了多个类,用于进行数据文件和数据流的读写操作。

1 文件和流

  文件(file)和流(stream)既有区别又有联系。文件是在各种媒质上(可移动磁盘、硬盘、光盘等)永久存储的数据的有序集合。它是一种进行数据读写操作的基本对象。通常情况下,文件按照树状目录进行组织,每个文件都有文件名、文件所在路径、创建时间、访问权限等属性。

  流是字节序列的抽象概念,例如文件、输入输出设备、内部进程通信管道或者TCP/IP 套接字等均可以看成流。简言之,流是一种向后备存储器写入字节和从后备存储器读取字节的方式。

  流也是进行数据读取操作的基本对象,流为我们提供了连续的字节流存储空间。虽然数据实际存储的位置可以不连续,甚至可以分布在多个磁盘上,但我们看到的是封装以后的数据结构,是连续的字节流抽象结构,这和一个文件也可以分布在磁盘上的多个扇区一样。‘

  除了和磁盘文件直接相关的文件流以外,还有多种其它类型的流,例如分布在网络中、内存中和磁带中的流,分别称为网络流、内存流和磁带流。

  所有表示流的类都是从抽象基类Stream 继承的。

  流有如下几种操作:

  ◆ 读取:从流中读取数据到变量中。
  ◆ 写入:把变量中的数据写入到流中。
  ◆ 定位:重新设置流的当前位置,以便随机读写。

  File 类的静态方法主要是用于创建FileStream 类。一个FileStream 类的实例实际上代表一个磁盘文件,使用FileStream 类可以对文件系统上的文件进行读取、写入、打开和关闭操作,也可以对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。由于FileStream 能够对输入输出进行缓冲,因此可以提高系统的性能。

2 文件的打开

  打开指定路径上的FileStream,可以使用File 类的Open 方法或OpenRead 方法或OpenText方法。利用Open 方法打开文件的方式有三种,如表所示。

表  Open方法的重载形式

名称 说明
File.Open (String, FileMode) 打开指定路径上的 FileStream,具有读/写访问权限
File.Open (String, FileMode, FileAccess) 以指定的模式和访问权限打开指定路径上的 FileStream
File.Open (String, FileMode, FileAccess, FileShare)

打开指定路径上的FileStream,具有指定的读、写或读/写访问模式以及指定的共享选项

   FileMode 值用于指定在文件不存在时是否创建该文件,并确定是保留还是改写现有文件的内容;FileAccess 值指定可以对文件执行的操作;FileShare 值指定其他线程所具有的对该文件的访问类型。

3 文本文件的读写

  利用Open 方法打开文件后,可以用StreamReader 类来读取文件的内容,用StreamWriter类向文件写入内容,它们提供了按文本模式读写数据的方法。下面示例中用到的OpenText 方法是File 类的一个静态方法,不能被某个具体的File 类的实例调用,它表示从一个已经存在的文本文件中读取一个文本流,并保存在一个StreamReader 实例中。

  【例】从一个文本文件中读取内容并显示在屏幕上。

using System;
using System.IO;
class FileTest
{
    public static void Main()
    {
        StreamReader sr;
        try
        {
            sr = File.OpenText("c:\\c#\\file1\\file1.txt");
        }
        catch
        {
            Console.WriteLine("文件打开失败");
            return;
        }
        while (sr.Peek() != -1)
        {
            String str = sr.ReadLine();
            Console.WriteLine(str);
        }
        Console.WriteLine("到达文件结尾");
        sr.Close();
    }
}

  【例】向文本文件中写入文本流

using System;
using System.IO;
class FileTest
{
    public static void Main()
    {
        StreamWriter sw;
        try
        {
            sw = File.CreateText("c:\\c#\\file1\\file2.txt");
        }
        catch
        {
            Console.WriteLine("文件创建失败");
            return;
        }
        sw.WriteLine("网址:");
        sw.WriteLine("www.sohu.com");
        sw.WriteLine("www.263.net");
        sw.WriteLine("www.microsoft.com/china");
        sw.WriteLine("www.sina.com.cn");
        sw.Close();
    }
}

4 二进制文件的读写

  System.IO 还为我们提供了BinaryReader 和BinaryWriter 类,用于按二进制模式读写文件。它们提供的一些读写方法是对称的,比如针对不同的数据结构,BinaryReader 提供了ReadByte、ReadBoolean、ReadInt、ReadInt16、ReadDouble、ReadString 等方法,而BinaryWriter 则提供了WriteByte、WriteBoolean、WriteInt、WriteInt16、WriteDoubleWriteString 方法。

  【例】将内存中随机产生的二进制数据写入文件,并验证写入结果是否正确。

using System;
using System.IO;
class BinaryRW
{
    static void Main()
    {
        int i = 0;
        //创建随机数据写入流
        byte[] writeArray = new byte[1000];
        new Random().NextBytes(writeArray);
        BinaryWriter binWriter = new BinaryWriter(new MemoryStream());
        BinaryReader binReader = new BinaryReader(binWriter.BaseStream);
        try
        {
            //将数据写入流
            Console.WriteLine("正在写数据…");
            for (i = 0; i < writeArray.Length; i++)
            {
                binWriter.Write(writeArray[i]);
            }
            //流定位到开始位置
            binReader.BaseStream.Position = 0;
            //读取流中的数据
            for (i = 0; i < writeArray.Length; i++)
            {
                if (binReader.ReadByte() != writeArray[i])
                {
                    Console.WriteLine("写数据错");
                    return;
                }
            }
            Console.WriteLine("数据已写入");
        }
        //捕获EndOfStreamException 异常,输出错误信息
        catch (EndOfStreamException e)
        {
            Console.WriteLine("写数据出错\n{0}", e.GetType().Name);
        }
    }
}

 

posted @ 2019-10-09 15:50  冬音  阅读(3856)  评论(0编辑  收藏  举报