• 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("写数据出错
    {0}", e.GetType().Name);
            }
        }
    }

     

  • 相关阅读:
    【SpringBoot】 理解SpringBoot的启动原理
    【SpringBoot】SpringBoot的基础,全面理解bean的生命周期
    【转】 Linux 命令解释(Linux基础二)
    【转】 Linux 的目录详解 (Linux基础一)
    【SpringBoot】 一种解决接口返回慢的方式
    【Jmeter基础】 Linux上运行Jmeter
    【SpingBoot】 测试如何使用SpringBoot搭建一个简单后台1
    单例模式@Singleton在测试中的运用
    性能测试基础 ---TCP通信过程的状态码与过程,以及出现错误码的分析(TIME_WAIT,CLOSE_WAIT)
    Spring5源码分析(007)——IoC篇之加载BeanDefinition总览
  • 原文地址:https://www.cnblogs.com/wintertone/p/11642282.html
Copyright © 2020-2023  润新知