文件流FileStram类
本节课主要学习三个内容:
创建FileStram流
读取流
写入流
文件流FileStram类,是用来实现对文件的读取和写入。FileStram是操作字节的字节数组,当提供向文件读取和写入字节的方法时,常用StramRead类或StramWrite类来完成,它们是操作字符的。
FileStream类的构造有多种形式,最简单的一种。FileStream(String path,FileMode mode);
FIleMode枚举有几种成员,用于规定如何打开或创建文件,这些成员可以联合使用。
枚举值 | 说明 |
Append | 打开现有文件并定位至文件结尾,或创建新文件 |
Create | 创建新文件,如存在,它将被改写 |
CreateNew | 创建新文件,如存在,将引发异常 |
Open | 打开现有文件 |
OpenorCreat | 如文件存在,打开;如不存在,创建新文件 |
TrunCate | 打开现有文件,文件一旦被打开,将被截断为0字节大小 |
在不使用FileAccess枚举参数的版本中,默认值使用的是ReadWrite
使用场合:如果需要以其他方式打开文件,就要附加一个参数,这个参数为FileAccess参数。
FIleStream(string path,FileMode mode,FileAccess access);
参数:有三个枚举值--只读模式(Read)、读/写模式(ReadWrite)、只写模式(Wite)。
作用:基于用户的权限级别改变用户对文件的访问权限。
实例:
桌面上51zxw文件夹中51zxw.txt,先读出其中的内容,然后在写入
File类和FIleInfo类提供了OpenRead()方法和OpenWrite方法用于创建FIleStream对象,OpenRead()方法用于以只读方式访问文件,OpenWrite方法则允许对文件进行写入内容操作。
如果利用File类及FileInfo类以只读方式访问桌面上“D:\Users\Walker\Dektop\51zxw\51zxw.txt”文件,该如何进行访问?
FileStream类有三个重要方法,分别为Seek方法、Read方法、Write方法。
Seek方法用于直接在文件中查找具体的位置
FIleStream类维护内部文件指针,这会指向文件中的位置。当打开文件时,默认指向文件的开始位置,这里的开始计算位置就是指的这个位置,它是一个SeekOrigin枚举,有3个成员,分别为Begin、Cruuent和End。移动距离是相对开始计算的位置而言的,它是以字节为单位,如下面代码将会使文件指针移动到文件开始中的第20个字节的位置。
byte [] mybyte=new byte[100]; char [] mychar=new char[100]; string path = @"C:\Users\Administrator\Desktop\51zxw.txt"; try { //定义文件流类 (对51zxw.txt ,文件操作模式打开或者新建,文件访问读和写) FileStream mystream = new FileStream(path,FileMode.OpenOrCreate,FileAccess.ReadWrite); //FIle 1种 //FileStream f1 = File.OpenRead(path); //FileInfo 2种 //FileInfo fs2 = new FileInfo(path); //文件流。查找(从0开始查找) mystream.Seek(0,SeekOrigin.Begin); //查找的同时写进缓冲区 //文件流.读取(读取到mybyte 从0开始,到mybyte总长度)FileStream 是字节流 必须用Byte[] 数组 mystream.Read(mybyte,0,mybyte.Length); //定义转码类 字节转换字符 =转换后。UTF8格式.将以编码的字节转换字符序列 Decoder dc = Encoding.UTF8.GetDecoder(); //字节数组解码成字符(mybyte,0开始,mybyte长度,解码成字符,清空解码器状态) dc.GetChars(mybyte,0,mybyte.Length,mychar,0); Console.WriteLine(mychar); Console.WriteLine("完成读取"); //赋值mychar mychar = "努力学习天天向上".ToCharArray(); //转码 =转换后.UTF8格式.将字符串解码字节序列 Encoder mydc = Encoding.UTF8.GetEncoder(); //字符数组解码成字节(要解码的,0开始,mychar长度,产生的字节数组,0,true) mydc.GetBytes(mychar,0,mychar.Length,mybyte,0,true); //文件流。查找(0开始); mystream.Seek(0,SeekOrigin.Begin); //文件流.写入(写入到mybyte,0开始,mybyte.总长度) mystream.Write(mybyte,0,mybyte.Length); //关闭文件数据流 mystream.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } }
实例
class Program { static void Main(string[] args) { try { //读取 byte[] mybute = new byte[100]; char[] mychar = new char[100]; string path = @"C:\Users\Administrator\Desktop\51zxw.txt"; FileStream mystr = File.OpenRead(path); mystr.Seek(0, SeekOrigin.Begin); mystr.Read(mybute, 0, mybute.Length); Decoder dc = Encoding.UTF8.GetDecoder(); dc.GetChars(mybute, 0, mybute.Length, mychar, 0); Console.WriteLine(mychar); //写入 mychar = "你好世界,世界你好".ToCharArray(); Encoder co = Encoding.UTF8.GetEncoder(); co.GetBytes(mychar, 0, mychar.Length, mybute, 0, true); mystr.Seek(0, SeekOrigin.Begin);//写入内部缓存区 mystr.Write(mybute, 0, mybute.Length); mystr.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } }
上述代码执行后 read可以读取,写入是不行的,要想写入 FileStream mystr=new FileStream(path,FileMode.OpenOrCreate,FileAccess.ReadWrite); 其中FileAccess 也可以不写,默认是读写功能