一篇文章即可把C#中的流解释得一清二楚

计算机编程中何为流

在计算机编程中,流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供。

C#包括以下标准IO(输入/输出)类,可从不同的源(例如文件,内存,网络,隔离存储等)进行读取/写入。

流(Stream): System.IO.Stream 是一个抽象类,提供了将字节(读,写等)传输到源的标准方法。就像包装器类一样传输字节。需要从特定源读取/写入字节的类必须实现Stream类。

以下类继承Stream类,以提供从特定源读取/写入字节的功能:

  • FileStream:从物理文件读取字节或向物理文件写入字节,无论它是.txt,.exe,.jpg还是任何其他文件。FileStream派生自Stream类。
  • MemoryStream: MemoryStream读取或写入存储在内存中的字节。
  • BufferedStream: BufferedStream从其他Stream读取或写入字节,以提高某些I / O操作的性能。
  • NetworkStream: NetworkStream从网络套接字读取或写入字节。
  • PipeStream: PipeStream读取或写入来自不同进程的字节。
  • CryptoStream: CryptoStream用于将数据流链接到密码转换。

C# StreamReader类:读取文件

在 C# 语言中 StreamReader 类用于从流中读取字符串。它继承自 TextReader 类。treamReader 类的构造方法有很多,这里介绍一些常用的构造方法,如下图所示。
在这里插入图片描述
使用该表中的构造方法即可创建 StreamReader 类的实例,通过实例调用其提供的类成 员能进行文件的读取操作。StreamReader 类中的常用属性和方法如下图所示。
在这里插入图片描述
例子:

using System;
using System.IO;

namespace MySpace
{
    
    

    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            //定义文件路径
            string path = @"E:\test\test.txt";

            //创建StreamReader对象
            StreamReader streamReader = new StreamReader(path);

            //获取流中的下一个字节的整数,如果没有获取到字符,则返回-1
            //获取获取全部字节
            while(streamReader.Peek() != -1)
            {
    
    
                //从当前流中读取一行字符并将数据作为字符串返回
                string str = streamReader.ReadLine();
                Console.WriteLine(str);
            }
            //关闭流
            streamReader.Close();
            Console.ReadKey();
        }
    }
}

运行结果:
在这里插入图片描述

C# StreamWriter类:写入文件

StreamReader 类对应的是 StreamWriter 类,StreamWriter 类主要用于向流中写入数据。
StreamWriter 类的构造方法也有很多,这里只列出一些常用的构造方法,如下图所示。
在这里插入图片描述
在创建了 StreamWriter 类的实例后即可调用其类成员,完成向文件中写入信息的操作。StreamWriter 类中常用的属性和方法如下图所示。
在这里插入图片描述
Write、WriteAsync、WriteLineAsync 方法还有很多不同类型写入的重载方,这里没有一一列出。

例子:

using System;
using System.IO;

namespace MySpace
{
    
    
    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            string path = @"E:\test\test.txt";
            //创建一个StreamWriter的对象
            StreamWriter streamWriter = new StreamWriter(path);

            //向文件中写入一个行
            streamWriter.WriteLine("QQ:");

            streamWriter.WriteLine("845264718");
            //刷新缓冲
            streamWriter.Flush();
            //关闭流
            streamWriter.Close();

       

        }
    }
}

运行结果:

在这里插入图片描述

C# FileStream类:文件读写

在 C# 语言中文件读写流使用 FileStream 类来表示,FileStream 类主要用于文件的读写,不仅能读写普通的文本文件,还可以读取图像文件、声音文件等不同格式的文件。

在创建 FileStream 类的实例时还会涉及多个枚举类型的值, 包括 FileAccess、FileMode、FileShare、FileOptions 等。

FileAccess 枚举类型主要用于设置文件的访问方式,具体的枚举值如下。

  • Read:以只读方式打开文件。
  • Write:以写方式打开文件。
  • ReadWrite:以读写方式打开文件。

FileMode 枚举类型主要用于设置文件打开或创建的方式,具体的枚举值如下。

  • CreateNew:创建新文件,如果文件已经存在,则会抛出异常。 Create:创建文件,如果文件不存在,则删除原来的文件,重新创建文件。

  • Open:打开已经存在的文件,如果文件不存在,则会抛出异常。 OpenOrCreate:打开已经存在的文件,如果文件不存在,则创建文件。

  • Truncate:打开已经存在的文件,并清除文件中的内容,保留文件的创建日期。如果文件不存在,则会抛出异常。

  • Append:打开文件,用于向文件中追加内容,如果文件不存在,则创建一个新文件。

FileShare 枚举类型主要用于设置多个对象同时访问同一个文件时的访问控制,具体的枚举值如下。

  • None:谢绝共享当前的文件。
  • Read:允许随后打开文件读取信息。
  • ReadWrite:允许随后打开文件读写信息。
  • Write:允许随后打开文件写入信息。
  • Delete:允许随后删除文件。
  • Inheritable:使文件句柄可由子进程继承。

FileOptions 枚举类型用于设置文件的高级选项,包括文件是否加密、访问后是否删除等,具体的枚举值如下。

  • WriteThrough:指示系统应通过任何中间缓存、直接写入磁盘。
  • None:指示在生成 System.IO.FileStream 对象时不应使用其他选项。
  • Encrypted:指示文件是加密的,只能通过用于加密的同一用户账户来解密。
  • DeleteOnClose:指示当不再使用某个文件时自动删除该文件。
  • SequentialScan:指示按从头到尾的顺序访问文件。 RandomAccess:指示随机访问文件。
  • Asynchronous:指示文件可用于异步读取和写入。

FileStream 类的构造方法有很多,这里介绍一些常用的构造方法,如下图所示。
在这里插入图片描述
在创建好 FileStream 类的实例后,即可调用该类中的成员完成读写数据的操作。FileStream 类中常用的属性和方法如下图所示。
在这里插入图片描述
例子1:


using System;
using System.IO;
using System.Text;//  byte[] bytes = Encoding.UTF8.GetBytes(msg);所用到的名字空间

namespace MySpcae
{
    
    
    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            //定义文件路径
            string path = @"E:\test\QQ.txt";
            ///创建FileStream类的对象
            ///第一参数path是文件路径
            ///第二个参数FileMode.OpenOrCreate 打开已存在的文件,不存在就创建
            ///第三个参数FileAccess.ReadWrite  以读写打开文件
            ///第四个参数FileShare.ReadWrite  允许随后打开文件读写信息
            FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate,
                FileAccess.ReadWrite, FileShare.ReadWrite);
            string msg = "845264718";
            //如果是中文,那么string长度不够用,将数据从字符串类型装换成字节类型
            byte[] bytes = Encoding.UTF8.GetBytes(msg);
            //从流中读取字节快并将该数据写入给定的缓冲区
            //bytes是字节块
            //0是位置
            //bytes.Length是字节块的大小
            fileStream.Write(bytes, 0, bytes.Length);
            //刷新缓冲区
            fileStream.Flush();
            //关闭流
            fileStream.Close();
        }
    }
}

运行结果:
在这里插入图片描述
例子2

using System;
using System.IO;
using System.Text;

namespace MySpace
{
    
    
    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            //指定文件路径
            string path = @"E:\test\QQ.txt";
            //判断是否含有指定文件
            if(File.Exists(path))
            {
    
    

                FileStream fileStream = new FileStream(path,
                    FileMode.Open, FileAccess.Read);
                //定义存放文件信息的字节数组
                byte[] bytes = new byte[fileStream.Length];
                fileStream.Read(bytes, 0, bytes.Length);
                //将得到的字节类型数组重写编码为字符型数组
                char[] c = Encoding.UTF8.GetChars(bytes);
                Console.WriteLine("My QQ:");
                Console.WriteLine(c);
                //关闭流
                fileStream.Close();
            }
            else
            {
    
    
                Console.WriteLine("您查看的文件不存在!");
            }
            Console.ReadKey();
        }
    }

}

运行结果:
在这里插入图片描述

C# BinaryReader类:读取二进制文件

在 C# 以二进制形式读取数据时使用的是 BinaryReader 类。BinaryReader 类中提供的构造方法有 3 种,具体的语法形式如下。

第1种形式:

BinaryReader(Stream input)   //其中,input 参数是输入流。

第2种形式:

BinaryReader(Stream input, Encoding encoding)   //其中,input 是指输入流,encoding 是指编码方式。

第3种形式:

BinaryReader(Stream input, Encoding encoding, bool leaveOpen)  //其中,input 是指输入流,encoding 是指编码方式,leaveOpen 是指在流读取后是否包括流的打开状态。

在完成 BinaryReader 类的实例的创建后,即可完成对文件以二进制形式的读取。

BinaryReader 类中的常用属性和方法如下图所示。
在这里插入图片描述
在 BinaryReader 类中提供的方法并不是直接读取文件中指定数据类型的值,而是读取由 BinaryWriter 类写入到文件中的。

在上述方法中只有 Read 方法不要求读取的值必须由 BinaryWriter 类写入到文件中。

例子1:

using System;
using System.IO;

namespace MySpace
{
    
    
    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            //只读方式创建文件流
            FileStream fileStream = new FileStream(@"E:\test\test.txt",
                FileMode.Open);
            //创建一个BinaryRead的对象
            BinaryReader binaryReader = new BinaryReader(fileStream);
            //从指定的流中读取字符
            int a = binaryReader.Read();
            //判断文件中是否含有字符,若不含字节,a的值为-1
            while(a != -1)
            {
    
    
                //输出读取到的字符
                Console.Write((char)a);
                a = binaryReader.Read();
            }
            Console.WriteLine();
            Console.ReadKey();
        }
    }
}

运行结果:
在这里插入图片描述
除了使用 Read 方法每次读取一个字符以外,也可以使用 Read 方法的其他重载方法将字符读取到一个字节数组或字符数组中。

例子2:

using System;
using System.IO;
using System.Text;


namespace MySpace
{
    
    
    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            //创建一个文件流对象,设定了打开方式,和只读权限
            FileStream fileStream = new FileStream(@"E:\test\test.txt",
                FileMode.Open, FileAccess.Read);
            //创建一个BinaryReader对象
            BinaryReader binaryReader = new BinaryReader(fileStream);
            //获取文件长度
            long length = fileStream.Length;
            byte[] bytes = new byte[length];
            //读取的文件内容并保存到字节数组中
            binaryReader.Read(bytes, 0, bytes.Length);
            //将字节数组转换为字符串
            String str = Encoding.Default.GetString(bytes);
            Console.WriteLine(str);

            Console.ReadKey();
        }
    }

    
}

运行结果:
在这里插入图片描述

C# BinaryWriter类:写入二进制数据

BinaryWriter 类用于向流中写入内容,其构造方法具体的语法形式如下。

第1种形式:

BinaryWriter(Stream output)

第2种形式:

BinaryWriter(Stream output, Encoding encoding)

第3种形式:

BinaryWriter(Stream output, Encoding encoding, bool leaveOpen)

BinaryWriter 类中常用的属性和方法如下图所示。
在这里插入图片描述
除了上面的方法以外,Write 方法还提供了多种类型的重载方法。

例子:

using System;
using System.IO;

namespace MySpace
{
    
    

    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            //创建一个文件写入流对象,存在就打开,权限是写
            FileStream fileStream = new FileStream(@"E:\test\test.txt",
                FileMode.Open, FileAccess.Write);
            //创建一个写入二进制流
            BinaryWriter binaryWriter = new BinaryWriter(fileStream);
            //向文件写入
            binaryWriter.Write("一起来学习啊");
            binaryWriter.Write(8456264718);
            //刷新缓冲区,将缓冲区内容写入文件中
            binaryWriter.Flush();
            binaryWriter.Close();
            //关闭二进制流
            fileStream.Close();
            //创建一个文件读取流,存在就打开,权限只读
            fileStream = new FileStream(@"E:\test\test.txt",
                FileMode.Open, FileAccess.Read);
            //创建一个二进制读取流
            BinaryReader binaryReader = new BinaryReader(fileStream);
            //读取数据显示到屏幕
            Console.WriteLine(binaryReader.ReadString());
            Console.WriteLine(binaryReader.ReadInt64());
            //关闭流
            binaryReader.Close();
            fileStream.Close();
        }
            
    }
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_50188452/article/details/115026555
今日推荐