C# 中的System.Object(流)读写文件
一、相关概念
1、在计算机编程中,流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供。
2、计算机中的流其实是一种信息的转换。它是一种有序流,因此相对于某一对象,通常我们把对象接收外界的信息输入(Input)称为输入流,相应地从对象向外 输出(Output)信息为输出流,合称为输入/输出流(I/O Streams)。
3、对象间进行信息或者数据的交换时总是先将对象或数据转换为某种形式的流,再通过流的传输,到达目的对象后再将流转换为对象数据。
所以, 可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。
4、流所在的命名空间也是System.IO,主要包括文本文件的读写、图像和声音文件的读写、二进制文件的读写等。
在 System.IO 命名空间中提供了多种类,用于进行文件和数据流的读写操作。要使用这些类,需要在程序的开头包含语句:using System.IO。
5、流是字节序列的抽象概念,例如文件、输入/输出设备、内部进程通信管道等。
6、流提供一种向后备存储器写入字节和从后备存储器读取字节的方式。
除了和磁盘文件直接相关的文件流以外,流还有多种类型。
例如数据流 (Stream) 是对串行传输数据的一种抽象表示,是对输入/输出的一种抽象。
数据有来源和目的地,衔接两者的就是串流对象。用比喻的方式来说或,数据就好比水,串流对象就好比水管,通过水管的衔接,水由一端流向另一端。
从应用程序的角度来说,如果将数据从来源取出,可以试用输入 ( 读 ) 串流,把数据储存在内存缓冲区;如果将数据写入目的地,可以使用输出 ( 写 ) 串流,把内存缓冲区的数据写入目的地。
当希望通过网络传输数据,或者对文件数据进行操作时,首先需要将数据转化为数据流。典型的数据流和某个外部数据源相关,数据源可以是文件、外部设备、内存、网络套接字等。根据数据源的不同,.Net 提供了多个从 Stream 类派生的子类,每个类代表一种 具体的数据流类型,比如磁盘文件直接相关的文件流类 FileStream,和套接字相关的网络流类 NetworkStream,和内存相关的内存流类 MemoryStream 等。
二、C#中相关的类间的关系及作用
BinaryReader 用特定的编码将基元数据类型读作二进制值
BinaryWriter 以二进制形式将基元类型写入流,并支持用特点的编码写入字符串
Stream为抽象类。由此有三个派生类:
MemoryStream:对内存进行读取与写入 (创建一个流,其后备存储为内存)
BufferedStream:对缓冲器进行读取/写入 (将缓冲层添加到另一个流上的读取和写入操作。 此类不能被继承。)
FileStream:对文件执行读取与写入 (为文件提供 System.IO.Stream,既支持同步读写操作,也支持异步读写操作。)
TextReader抽象类,派生2个类:
StringReader:实现从字符串读取的 System.IO.TextReader
StreamReader:实现一个 System.IO.TextReader,使其以一种特定的编码从字节流中读取字符
TextWrite 抽象类,派生2个类:
StringWriter 实现一个用于将信息写入字符串的 System.IO.TextWriter。 该信息存储在基础 System.Text.StringBuilder 中。
StreamWriter 实现一个 System.IO.TextWriter,使其以一种特定的编码向流中写入字符。
三、重点介绍几种常用的类
1、使用FileStream类读写二进制文件
2、使用StreamReader 读写文本文件
我们对文本文件的读写一般使用StreamReader和StreamWriter,因为不同的文本有不同的编码格式,这个StreamReader会帮我们自动处理,所以我们不需要关心文本文件的编码是什么
StreamReader 类用于从流中读取字符串。它继承自 TextReader 类
StreamReader 类的构造方法有很多,这里介绍一些常用的构造方法,如下表所示。
构造方法 | 说明 |
---|---|
StreamReader(Stream stream) | 为指定的流创建 StreamReader 类的实例 |
StreamReader(string path) | 为指定路径的文件创建 StreamReader 类的实例 |
StreamReader(Stream stream, Encoding encoding) | 用指定的字符编码为指定的流初始化 StreamReader 类的一个新实例 |
StreamReader(string path, Encoding encoding) | 用指定的字符编码为指定的文件名初始化 StreamReader 类的一个新实例 |
使用该表中的构造方法即可创建 StreamReader 类的实例,通过实例调用其提供的类成 员能进行文件的读取操作。
StreamReader 类中的常用属性和方法如下表所示。
属性或方法 | 作用 |
---|---|
Encoding CurrentEncoding | 只读属性,获取当前流中使用的编码方式 |
bool EndOfStream | 只读属性,获取当前的流位置是否在流结尾 |
void Close() | 关闭流 |
int Peek() | 获取流中的下一个字符的整数,如果没有获取到字符, 则返回 -1 |
int Read() | 获取流中的下一个字符的整数 |
int Read(char[] buffer, int index, int count) | 从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区 |
string ReadLine() | 从当前流中读取一行字符并将数据作为字符串返回 |
string ReadToEnd() | 读取来自流的当前位置到结尾的所有字符 |
下面通过实例来演示 StreamReader 类的应用。
文本读取流StreamReader-创建
//1,创建文本的读取流(会检查字节码标记确定编码格式) StreamReader sr = new StreamReader(@"c:\xx\ReadMe.txt"); //2,指定编码格式(可取的编码格式 ASCII Unicode UTF7 UTF8 UTF32) StreamReader str = new StreamReader(@"c:\xx\xx.txt", Encoding.UTF8); //3,在文件流的基础上创建文本读取流 FileStream fs = new FileStream(@"c:\xx\xx.txt", FileMode.Open, FileAccess.Read, FileShare.None); StreamReader sr = new StreamReader(fs); //4,通过文件信息创建文本读取流 - 第二种方式 FileInfo myFile = new FileInfo(@"c:\xx\xx.txt"); StreamReader sr = myFile.OpenText(); //流的关闭 sr.Close();
读取文本文件
//1,读取一行字符串 string nextLine = sr.ReadLine();//读取一行字符串 //2,读取流中所有剩余的文本内容 string restOfStream = sr.ReadToEnd();//读取流中所有剩余的文本内容 //3,只读取一个字符 int nextChar = sr.Read();//只读取一个字符 int nChars = 100; char[] charArray = new char[nChars]; //读取多个字符,第一个参数是要存放的字符数组,第二个参数是从数组的哪一个索引开始放,第三个参数是读取多少个字符 返回值是实际读取的字符的个数 int nCharsRead = sr.Read(charArray, 0, nChars);
文本写入流StreamWriter-创建
//1,(默认使用UTF - 8编码) StreamWriter sw = new StreamWriter(@"c:\xx\xx.txt"); //2,第二个参数表示是否以追加的方式打开,第三个参数是编码方式 StreamWriter sw = new StreamWriter(@"c:\xx\xx.txt", true, Encoding.ASCII) //3,通过FileStream创建StreamWriter FileStream fs = new FileStream(@"c:\xx\xx.txt", FileMode.CreateNew, FileAccess.Write, FileShare.Read); StreamWriter sw = new StreamWriter(fs); //4,通过FileInfo创建StreamWriter FileInfo myFile = new FileInfo(@"c:\xx\xx.txt"); StreamWriter sw = myFile.CreateText(); //所有流用完之后关闭 sw.Close();
//1,写入一行字符 string nextLine = "x xx x x x x "; sw.Write(nextLine); //2,写入一个字符 char nextChar = 'a'; sw.Write(nextChar); //3,写入字符数组 char[] charArray =..; sw.Write(charArray); //4,写入字符数组的一部分 //1:要写入的数组 2:开始索引 3写入长度 sw.Write(charArray, StartIndex, Length);
小Demo:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//创建文件并写入内容 if (!File.Exists(@"C:\Users\lu\Desktop\111.txt")) { //File.Create(@"C:\Users\lu\Desktop\111.txt"); using(StreamWriter sw = File.CreateText(@"C:\Users\lu\Desktop\111.txt")) { sw.Write("啊哈哈哈"); } } //读取内容 string text = File.ReadAllText(@"C:\Users\lu\Desktop\111.txt"); Console.WriteLine(text); //往现有的文件中写内容 File.WriteAllText(@"C:\Users\lu\Desktop\111.txt", "大家好才是真的好"); text = File.ReadAllText(@"C:\Users\lu\Desktop\111.txt"); Console.WriteLine(text); //复制 File.Copy(@"C:\Users\lu\Desktop\111.txt", @"C:\Users\lu\Desktop\222.txt"); //Console.ReadKey(); //移动 File.Move(@"C:\Users\lu\Desktop\111.txt", @"C:\Users\lu\Desktop\Demo\222.txt"); //删除 File.Delete(@"C:\Users\lu\Desktop\222.txt");