• c#基础语言编程-文件流操作


    引言

    在System.IO 命名空间下提供了一系列的类,我们可以通过相应的类进行文件、目录、数据流的操作。
    1、File类:提供用于创建、复制、删除、移动和打开文件的静态方法。File类
    2、FileInfo类:提供创建、复制、删除、移动和打开文件的属性和实例方法。FileInfo类
    3、FileStream类:主要用于读取磁盘上的文件或者向磁盘文件写入信息。有时,我们需要将程序中的一些数据存储到磁盘上或是读取配置文件中某些内容,在这里我们就会用该类。
    4、MemoryStream类: 主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明MemoryStream类来存储并且处理它们。
    5、BufferedStream类:主要也是用来处理流数据的,但是该类主要的功能是用来封装其他流类。为什么要封装其他流类,这么做的意义是什么?按照微软的话说主要是减少某些流直接操作存储设备的时间。对于一些流来说直接向磁盘中存储数据这种做法的效率并不高,用BufferedStream包装过的流,先在内存中进行统一的处理再向磁盘中写入数据,也会提高写入的效率。
    6、 NetworkStream类:主要是专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。
    7、StreamReader/StreamWriter类:主要用来处理流数据。它们分别提供了高效的流读取/写入功能。
    8、TextReader/TextWriter类:主要用来处理流数据。它们分别提供了高效的文本流读取/写入功能。

    Stream类,TextReader类,TextWriter类,BinaryReader类,BinaryWriter类都继承了IDisposable接口,所以使用后必须关闭流。把流中数据加载到内存时要考虑内存溢出等问题Stream类,TextReader类,TextWriter类都为抽象类。

    File类

    提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。重要点在于协助创建FileStream对象,从而进行一下操作,所以File类的应用重点在创建、删除、打开等操作。
    重点方法:
    File.Exists 确定文件是否存在,经常用的。
    File.Create 指定路径创建文件,这方法应用很少。
    File.move 将指定文件移到新位置,并提供指定新文件名的选项。
    File.OpenRead 打开现有文件以进行读取。返回FileStream 比较常用,可以应用比较广泛的流。
    File.OpenWrite 打开现有文件以进行写入.
    File.OpenText 打开现有 UTF-8 编码文本文件以进行读取。这个在写日志时,应用比较广泛。
    File.AppendText 创建一个 StreamWriter,它将 UTF-8 编码文本追加到现有文件。这个也比较常用,以供日志随时读取和写入。

     //1.判断一个文件是否存在
    
     if (!File.Exists(@"c:hello.txt"))
      {
          File.Create(@"c:hello.txt");
      }
    ////2.拷贝一个文件
        File.Copy(@"c:hello.txt", @"d:hello.txt");
    //File.Move(); 移动,剪切文件
     //4.删除一个文件
    //文件的删除,即便文件不存在也不会报异常
       File.Delete(@"c:abc.txt");
      //5.读取一个文件,写入
    File.WriteAllText(@"c:xxx.txt", "你好China !");

    FileStream类

    使用 FileStream 类对文件系统上的文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream 对输入输出进行缓冲,从而提高性能。
    请确保对所有 FileStream 对象调用 Dispose 方法,特别是在磁盘空间有限的环境中。如果没有可用的磁盘空间并且在终止 FileStream 之前没有调用 Dispose 方法,则执行 IO 操作会引发异常。
    file 类是实用工具类,所带静态方法主要用于根据文件路径和标准输入、标准输出以及标准错误设备创建 FileStream 对象。MemoryStream 类通过字节数组创建流,而且功能与 FileStream 类似。

    • FileStream文件流的使用方式。
      一、创建一个文件流
      二、读文件或者写文件
      三、关闭文件流
      四、释放相关资源
     ////1.创建一个    中国.txt
        string txt = "中国是四大文明古国之一";
      //一、创建一个文件流
      FileStream fs = new FileStream(@"c:中国.txt", FileMode.Create, FileAccess.Write);
      byte[] buffer = Encoding.UTF8.GetBytes(txt);
     //二、读文件或者写文件
    //参数1:表示要把哪个byte[]数组中的内容写入到文件
      //参数2:表示要从该byte[]数组的第几个下标开始写入,一般都是0
      //参数3:要写入的字节的个数。
    fs.Write(buffer, 0, buffer.Length);
    //三、关闭文件流
     //清空缓冲区
      fs.Flush();
    fs.Close();
    //四、释放相关资源
     fs.Dispose();

    针对释放资源,一般使用Using

    using (FileStream fs = new FileStream(@"c:中国.txt", FileMode.Create, FileAccess.Write))
      {
     byte[] buffer = Encoding.UTF8.GetBytes(txt);
    //二、读文件或者写文件fs.Write(buffer, 0, buffer.Length);
      }

    这样就ok了。
    利用FIleStream进行文件复制操作

     //1.创建一个读取源文件的文件流
    using (FileStream fsRead = new FileStream(source, FileMode.Open, FileAccess.Read))
      {
       //2.创建一个写入新文件的文件流
         using (FileStream fsWrite = new FileStream(target, FileMode.Create, FileAccess.Write))
       {
       //创建缓冲区
       byte[] buffer = new byte[1024 * 1024 * 5];
        //3.通过fsRead读取源文件,然后再通过fsWrite写入新文件
    //通过文件流读取
    //返回值:表示本次实际读取到的字节个数。
    int byteCount = fsRead.Read(buffer, 0, buffer.Length);
     while (byteCount > 0)
        {
        //把刚刚读取到的内容写入到新文件流中
        fsWrite.Write(buffer, 0,byteCount);
       //需要循环执行读写操作
       //把上次读取到内容写入完毕后,继续再读取,这里会自动定位。
       byteCount = fsRead.Read(buffer, 0, buffer.Length);
      //fsRead.Position
      //fsWrite.Position
       Console.Write(". ");
          }
       }
    }

    用filestream从文件中读取文件。是通过指定文件大小读取文件。如果在操作过程中,读取一部分显示一部分时,加入获取的byte数组的大小有错误,可能导致文件显示不正确。所以在文件读取显示操作时不能用filestream。专门针对文件操作的文件流。

    StreamReader/StreamWriter类

    StreamReader/StreamWriter主要用来处理流数据。它们分别提供了高效的流读取/写入功能。

    StreamReader/Writer读写
    StreamReader reader = new StreamReader("filePath");//初始化读取
    StreamWriter writer = new StreamWriter("filePath");//初始化写入
    //或者,如果没有就会创建文件,不会报错
    StreamWriter writer = File.AppendText("Filepath");
    
    string readStr=reader.ReadLine();//从流中读取一行
    //2.循环读取每一行数据。
    string line = null;
    //int count = 0;
    while ((line = reader.ReadLine()) != null)
    {
     //count++;
     Console.WriteLine(line);
     }
    string readAff = reader.ReadToEnd();//从流中读取全部
    
    writer.Write("Hi 你好");//写入内容
    writer.WriteLine("Hi 你好");//写入一行
    
    reader.Close();//关闭流
    writer.Close();

    其他流

    MemoryStream类主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明MemoryStream类来存储并且处理它们。读取图片数据可以用

    
    string str = "Hi!你好!";
    byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转化为字节数组
    MemoryStream memory = new MemoryStream(array);//初始化MemoryStream类
    byte[] arrayNew = memory.ToArray();//将内存中的数据转换为字节数组
    string strNew = Encoding.UTF8.GetString(arrayNew);//将字节数组转换为字符串

    BufferedStream类主要也是用来处理流数据的,但是该类主要的功能是用来封装其他流类。为什么要封装其他流类,这么做的意义是什么?按照微软的话说主要是减少某些流直接操作存储设备的时间。对于一些流来说直接向磁盘中存储数据这种做法的效率并不高,用BufferedStream包装过的流,先在内存中进行统一的处理再向磁盘中写入数据,也会提高写入的效率。
    NetWorkStream类是专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。

    //服务器
    TcpListener lis=new TcpListener(5000); //服务器监听
    lis.Start();//启动
    Socket sock=lis.AcceptSocket();//阻塞,直到有客户端连接
    
    NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流
    if (netStream.DataAvailable)   //如果客户端发送了消息
    {
       byte[] data = new byte[1024];   //定义一个字节数组,用来存放接收的数据
       int len = netStream.Read(data, 0, data.Length);  //从位置开始,读取到字节数组末尾
       string line = Encoding.Default.GetString(data, 0, len);  //把收到的字节转换为字符串
    }
    //客户端
    TcpClient client = new TcpClient();//客户端tcp对象
    client.Connect("127.0.0.1", 5000);//连接服务器
    NetworkStream myStream = client.GetStream();//得到网络流
    
    byte[] data = Encoding.Default.GetBytes("Hi,你好");  //首先把输入的字符串消息转换为字节
    myStream .Write(data, 0, data.Length);  //向myStream 里写入数据
    myStream .Flush();  //刷新流中的数据
    myStream .Close();
  • 相关阅读:
    关于钩子函数的详细解答:
    Vue实现回到顶部
    Vue实现Rate组件(星星评分)
    Vue-router 路由模式
    javascript中实现跨域的方式
    Promise
    webpack使用
    小程序登录
    api工厂的sdk的使用
    面试题划“重点”
  • 原文地址:https://www.cnblogs.com/polly333/p/4498383.html
Copyright © 2020-2023  润新知