读写文件
使用File读写文件
读取文件
在.NET 2.0扩展了File类,通过File可以读写文件。
1.File.ReadAllText(FilePath);根据文件路径读取文件中所有的文本 2.File.ReadAllText(FilePath,Encoding);//Encoding可以指定一个编码格式Encoding.ASCII; 3.File.ReadAllBytes()方法可以打开二进制文件把内容读入一个字节数组 4.File.ReadAllLines() 以行的形式读取文件,一行一个字符串,返回一个字符串的数组
写入文件
我们读取文件有ReadAllText() ReadAllLines()和ReadAllBytes()这几个方法,对应的写入文件的方法有WriteAllText() WriteAllLines()和WriteAllBytes()
流FileStream
流是一个用于传输数据的对象,数据可以向两个方向传输:
如果数据从外部源传输到程序中,这就是读取流
如果数据从程序传输到外部源中,这就是写入流
外部源可能是
一个文件
网络上的数据
内存区域上
读写到命名管道上
读写内存使用System.IO.MemorySystem 处理网络数据使用System.Net.Sockets.NetworkStream
与流相关的类
FileStream(文件流) 这个类主要用于二进制文件中读写,也可以使用它读写任何文件。
StreamReader(流读取器)和StreamWriter(流写入器)专门用于读写文本文件
使用FileStream类读写二进制文件
FileStream实例用于读写文件中的数据,要构造FileStream实例,需要提供下面的4中信息:
- 要访问的文件 - 一般提供一个文件的完整路径名
- 表示如何打开文件的模式 - 新建文件或打开一个现有文件,如果打开一个现有的文件,写入操作是覆盖文件原来的内容,还是追加到文件的末尾?
- 表示访问文件的方式 - 只读 只写 还是读写
- 共享访问 - 表示是否独占访问文件,如果允许其他流同时访问文件,则这些流是只读 只写 还是读写文件
FileStream构造函数的参数
参数 | 取值 |
---|---|
FileMode( 打开模式) | Append,Create,CreateNew,Open,OpenOrCreate和Truncate |
FileAccess(读取还是写入) | Read,ReadWrite和Write |
FileShare(文件共享设置) | Delete,Inheritable,None,Read,ReadWrite和Write |
注意
如果文件不存在 Append Open和Truncate会抛出异常
如果文件存在 CreateNew会抛出异常
Create 和 OpenOrCreate Create会删除现有的文件,新建一个空的文件,OpenOrCreate会判断当前是否有文件,没有的话才会创建
创建FileStream文件流
FileStream fs = new FileStream(@"c:\xx\xx.doc",FileMode.Create);
FileStream fs2 = new FileStream(@"c:\xx\xx.doc",FileAccess.Write);
FileStream fs3 = new FileStream(@"c:\xx\xx.doc",FileAccess.Write,FileShare.None);
通过FileInfo打开文件流
FileInfo myfile1 = new FileInfo(@"c:\xx\xx.doc");
FileStream fs4= myfile1.OpenRead();
FileInfo myfile2 = new FileInfo(@"c:\xx\xx.doc");
FileStream fs5= myfile2.OpenWrite();
FileInfo myfile3 = new FileInfo(@"c:\xx\xx.doc");
FileStream fs6= myfile3.Open(FileMode.Append,FileAccess.Write,FileShare.None);
FileInfo myfile4 = new FileInfo(@"c:\xx\xx.doc");
FileStream fs7= myfile4.Create();
FileStream文件流的关闭
当我们使用完了一个流之后,一定要调用fs.Close();方法去关闭流,关闭流会释放与它相关联的资源,允许其他应用程序为同一个文件设置流。这个操作也会刷新缓冲区。
从文件流中读取内容和写入内容
从文件流读取内容
int nextByte = fs.ReadByte();//读取一个字节(0-255)的数据,返回结果,
//如果达到流的末尾,就返回-1
int nBytesRead = fs.Read(ByteArray,0,nBytes);//读取多个字节,
//第一个是存放的数组,
//第二个参数是开始存放的索引,
//第三个参数是要读取多少个字节。
//返回的结果是读取的自己的实际个数,如果达到流的末尾 返回-1
向文件流写入内容
byte NextByte = 100;
fs.WriteByte(NextByte);//把一个字节写入文件流中
fs.Write(ByteArray,0,nBytes);//把一个自己数组写入文件流中 参数同上
StreamReader和StreamWriter读写文本文件
我们对文本文件的读写一般使用StreamReader和StreamWriter,因为不同的文本有不同的编码格式,这个StreamReader会帮我们自动处理,所以我们不需要关心文本文件的编码是什么
1,创建文本的读取流(会检查字节码标记确定编码格式)
StreamReader sr = new StreamReader(@"c:\xx\ReadMe.txt");
2,指定编码格式
StreamReader str = new StreamReader(@"c:\xx\xx.txt",Encoding.UTF8);//Encoding需导入System.Text
//(可取的编码格式 ASCII Unicode UTF7 UTF8 UTF32)
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();
读取文本文件
string nextLine = sr.ReadLine();//读取一行字符串
string restOfStream = sr.ReadToEnd();//读取流中所有剩余的文本内容
int nextChar = sr.Read();//只读取一个字符
int nChars = 100;
char[] charArray = new char[nChars];
int nCharsRead = sr.Read(charArray,0,nChars); //读取多个字符,
//第一个参数是要存放的字符数组,
//第二个参数是从数组的哪一个索引开始放,
//第三个参数是读取多少个字符
//返回值是实际读取的字符的个数
文本写入流StreamWriter-创建
1.StreamWriter的创建
StreamWriter sw = new StreamWriter(@"c:\xx\xx.txt");//(默认使用UTF-8编码)
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();
文本写入流StreamWriter-写入
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.写入字符数组的一部分
sw.Write(charArray,StartIndex,Length);
//1:要写入的数组 2:开始索引 3:写入长度