读写文件

使用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:写入长度

results matching ""

    No results matching ""