C#流处理文件 文件读写常用类

一、流的定义
现在处理文件使用强大的选项:流。流是一个用于传输数据的对象。
读取流:数据从外部源传输到程序中。
写入流:数据从程序中传输到外部源中。
外部源常常是一个文件,但不完全都是文件,可以是:
1)使用一些网络协议读写网络上的数据,或是从另一个计算机上发送数据;
2)读写到命名管道上;
3)把数据读写到一个内存区域上;
二、常用的文件读写类
1)FileStream (文件流) 主要用于在二进制文件中读取二进制数据
2)StreamReader (流读取器)和StreamWriter (流写入器) 专门用于读取文本格式的流产品
3)BinaryReader和BinaryWriter 专门读写二进制格式的流产品
二、使用文件流类
1)FileStream

A、FileStream构造

构造FileStream实例,需要以下信息
1:要访问的文件
2:如何打开文件的模式。如新建一个文件或打开一个现有的文件。如果打开一个现有的文件,写入操作是覆盖文件原来的内容,还是追加到文件的末尾
3:访问文件的方式 只读、只写还是读写
4:共享访问 表示是否独占访问文件。如果允许其他流同时访问文件,则这些流是只读、只写还是读写文件。

第一信息通常用一个包含文件的完整路径名的字符串来表示,其他三个信息分别由3个.net枚举 FileMode,FileAccess,FileShare来表示。
1.枚举类FileMode
指定操作系统打开文件的方式

CreateNew 指定操作系统应创建一个新的文件
Create 指定操作系统应创建一个新的文件。 如果该文件已存在,则会覆盖它
Open 指定操作系统应打开现有文件
OpenOrCreate 指定操作系统应打开一个文件,是否它存在,则否则,应创建一个新的文件
Truncate 指定操作系统应打开现有文件。 当打开文件时,应被截断,以便其大小为零字节
Append 如果它存在,并且查找到该文件的末尾,或者创建一个新文件,请打开该文件

2.枚举类FileAccess

对于读、 写或读/写访问的文件中定义的常数

Read 对文件的读取访问权限。 可以从文件读取数据
Write 对文件的写入访问权限。 数据可以写入该文件
ReadWrite 读取和写入到文件的访问。 可以写入和从文件中读取数据

3.枚举类FileShare

包含用于控制的访问其他类型的常数 System.IO.FileStream 对象可以具有相同的文件

None 拒绝共享当前文件。 在关闭文件之前,任何请求打开的文件 (此进程或另一个进程) 将失败
Read 允许以后打开文件进行读取
Write 允许以后打开文件进行写入
ReadWrite 允许以后打开的文件进行读取或写入
Delete 允许以后删除文件
Inheritable 使文件句柄由子进程继承。 这是不直接支持 Win32

常用构造形式:
FileStream(String 文件路径,FileMode 文件打开模式)
FileStream(String 文件路径,FileMode 文件打开模式,FileAccess 文件访问方式)
FileStream(String 文件路径,FileMode 文件打开模式,FileAccess 文件访问方式,FileShare 文件共享方式)

实例:
FileStream fileStream = new FileStream(@“D:\file.txt”,FileMode.Open,FileAccess.Read,FileShare.Read);
FileStream有很多构造函数,上面的带4个参数。

B、FileStream常用属性

CanRead 判断当前流是否支持读取,返回bool值,True表示可以读取
CanWrite 判断当前流是否支持写入,返回bool值,True表示可以写入
Position 获取或设置此流的当前位置

B、FileStream常用方法

Read() 从流中读取数据,返回字节数组
Write() 将字节块(字节数组)写入该流
Seek() 设置文件读取或写入的起始位置
Flush() 清除该流缓冲区,使得所有缓冲的数据都被写入到文件中
Close() 关闭当前流并释放与之相关联的所有系统资源

2)StreamReader
StreamReader 类用于从流中读取字符串。它继承自 TextReader 类。

A、StreamReader构造

StreamReader 类的构造方法有很多,这里介绍一些常用的构造方法。
构造方法
StreamReader(Stream stream) 为指定的流创建 StreamReader 类的实例
StreamReader(string path) 为指定路径的文件创建 StreamReader 类的实例
StreamReader(Stream stream, Encoding encoding) 用指定的字符编码为指定的流初始化 StreamReader 类的一个新实例
StreamReader(string path, Encoding encoding) 用指定的字符编码为指定的文件名初始化 StreamReader 类的一个新实例

B、StreamReader属性
Encoding CurrentEncoding 只读属性,获取当前流中使用的编码方式
bool EndOfStream 只读属性,获取当前的流位置是否在流结尾
C、StreamReader方法
void Close() 关闭流
int Peek() 获取流中的下一个字符的整数,如果没有获取到字符, 则返回 -1
int Read() 获取流中的下一个字符的整数
int Read(char[] buffer, int index, int count) 从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区
string ReadLine() 从当前流中读取一行字符并将数据作为字符串返回
string ReadToEnd() 读取来自流的当前位置到结尾的所有字符

D、实例

class Program
{
    static void Main(string[] args)
    {
        //定义文件路径
        string path = @"D:\\code\\test.txt";
        //创建 StreamReader 类的实例
        StreamReader streamReader = new StreamReader(path);
        //判断文件中是否有字符
        while (streamReader.Peek() != -1)
        {
            //读取文件中的一行字符
            string str = streamReader.ReadLine();
            Console.WriteLine(str);
        }
        streamReader.Close();
    }
}

3)StreamWriter
StreamWriter 类主要用于向流中写入数据。
A、StreamWriter构造
StreamWriter(Stream stream) 为指定的流创建 StreamWriter 类的实例
StreamWriter(string path) 为指定路径的文件创建 StreamWriter 类的实例
StreamWriter(Stream stream, Encoding encoding) 用指定的字符编码为指定的流初始化 StreamWriter 类的一个新实例
StreamWriter(string path, Encoding encoding) 用指定的字符编码为指定的文件名初始化 StreamWriter 类的一个新实例
B、StreamWriter属性
bool AutoFlush 属性,获取或设置是否自动刷新缓冲区
Encoding Encoding 只读属性,获取当前流中的编码方式
C、StreamWriter方法
void Close() 关闭流
void Flush() 刷新缓冲区
void Write(char value) 将字符写入流中
void WriteLine(char value) 将字符换行写入流中
Task WriteAsync(char value) 将字符异步写入流中
Task WriteLineAsync(char value) 将字符异步换行写入流中
D、实例

class Program
{
    static void Main(string[] args)
    {
        string path = @"D:\\code\\test.txt";
        //创建StreamWriter 类的实例
        StreamWriter streamWriter = new StreamWriter(path);
        //向文件中写入姓名
        streamWriter.WriteLine("小张");
        //向文件中写入手机号
        streamWriter.WriteLine("13112345678");
        //刷新缓存
        streamWriter.Flush();
        //关闭流
        streamWriter.Close();
    }
}

4)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 类中提供的构造方法有 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 类的实例,代码如下。

属性和方法:
int Read() 从指定的流中读取字符
int Read(byte[] buffer, int index, int count) 以 index 为字节数组中的起始点,从流中读取 count 个字节
int Read(char[] buffer, int index, int count) 以 index 为字符数组的起始点,从流中读取 count 个字符
bool ReadBoolean() 从当前流中读取 Boolean 值,并使该流的当前位置提升 1 个字节
byte ReadByte() 从当前流中读取下一个字节,并使流的当前位置提升 1 个字节
byte[] ReadBytes(int count) 从当前流中读取指定的字节数写入字节数组中,并将当前 位置前移相应的字节数
char ReadChar() 从当前流中读取下一个字符,并根据所使用的 Encoding 和从流中读取的特定字符提升流的当前位置
char[] ReadChars(int count) 从当前流中读取指定的字符数,并以字符数组的形式返回 数据,然后根据所使用的 Encoding 和从流中读取的特定字符将当前位置前移
decimal ReadDecimal() 从当前流中读取十进制数值,并将该流的当前位置提升 16 个字节
double ReadDouble() 从当前流中读取 8 字节浮点值,并使流的当前位置提升 8 个字节
short ReadInt16() 从当前流中读取 2 字节有符号整数,并使流的当前位置提升 2 个字节
int ReadInt32() 从当前流中读取 4 字节有符号整数,并使流的当前位置提升 4 个字节
long ReadInt64() 从当前流中读取 8 字节有符号整数,并使流的当前位置提升 8 个字节
sbyte ReadSByte() 从该流中读取 1 个有符号字节,并使流的当前位置提升 1 个字节
float ReadSingle() 从当前流中读取 4 字节浮点值,并使流的当前位置提升 4 个字节
string ReadString() 从当前流中读取一个字符串。字符串有长度前缀,一次 7 位地被编码为整数
ushort ReadUInt16() 从该流中读取的 2 字节无符号整数
uint ReadUInt32() 从该流中读取的 4 字节无符号整数
ulong ReadUInt64() 从该流中读取的 8 字节无符号整数
void FillBuffer(int numBytes) 用从流中读取的指定字节数填充内部缓冲区
实例:

class Program
{
    static void Main(string[] args)
    {
        FileStream fileStream = new FileStream(@"D:\\code\\test.txt", FileMode.Open);
        BinaryReader binaryReader = new BinaryReader(fileStream);
        //读取文件的一个字符
        int a = binaryReader.Read();
        //判断文件中是否含有字符,若不含字符,a 的值为 -1
        while(a!= -1)
        {
            //输出读取到的字符
            Console.Write((char)a);
            a = binaryReader.Read();
        }
    }
}

5)BinaryWriter
第1种形式:
BinaryWriter(Stream output)
第2种形式:
BinaryWriter(Stream output, Encoding encoding)
第3种形式:
BinaryWriter(Stream output, Encoding encoding, bool leaveOpen)
属性和方法:

void Close() 关闭流
void Flush() 清理当前编写器的所有缓冲区,使所有缓冲数据写入基础设备
long Seek(int offset, SeekOrigin origin) 返回查找的当前流的位置
void Write(char[] chars) 将字符数组写入当前流
Write7BitEncodedInt(int value) 以压缩格式写出 32 位整数
实例:

class Program
{
    static void Main(string[] args)
    {
        FileStream fileStream = new FileStream(@"D:\\code\\test.txt", FileMode.Open, FileAccess.Write);
        //创建二进制写入流的实例
        BinaryWriter binaryWriter = new BinaryWriter(fileStream);
        //向文件中写入图书名称
        binaryWriter.Write("C#基础教程");
        //向文件中写入图书价格
        binaryWriter.Write(49.5);
        //清除缓冲区的内容,将缓冲区中的内容写入到文件中
        binaryWriter.Flush();
        //关闭二进制流
        binaryWriter.Close();
        //关闭文件流
        fileStream.Close();
        fileStream = new FileStream(@"D:\\code\\test.txt", FileMode.Open, FileAccess.Read);
        //创建二进制读取流的实例
        BinaryReader binaryReader = new BinaryReader(fileStream);
        //输出图书名称
        Console.WriteLine(binaryReader.ReadString());
        //输出图书价格
        Console.WriteLine(binaryReader.ReadDouble());
        //关闭二进制读取流
        binaryReader.Close();
        //关闭文件流
        fileStream.Close();
    }
}

你可能感兴趣的:(.NET)