这节讲一下使用FileStream读写数据,这是一个比较基础的流。
FileStream类只能处理原始字节,所以它可以处理任何类型的文件。
先看一下它的构造方法:
FileStream fs = new FileStream("./demo.txt", FileMode.Open, FileAccess.Read);
这个方法最少有两个参数,也就是前两个,第一个是文件路径,第二个FileMode枚举,规定文件的打开方式,是正常打开还是创建等等,第三个是FileAccess枚举,规定流的访问形式,是写入还是读取等等,不指明这个参数,它的默认值是ReadWrite,也就是可读可写。
FileMode枚举成员:
FileAccess枚举成员:
File和FileInfo类都提供了OpenRead()和OpenWrite()这两个方法,可以快速创建只读或者只写的FileStream对象。
读写文件:
读取文件,需要用到Read()和Write(),这两个方法最常用的重载如下所示:
len=fs.Read(buffer, 0, buffer.Length) write.Write(buffer, 0, len)
buffer是一个字节数组,用于存放一次读取的字节,可以自定义大小;第二个参数是偏移量,指示从buffer的第几个索引开始读,一般都是0,从开始读取;第三个参数是一次读取的大小,这个一般也都是固定的,是数组的长度。Read()方法的返回值是本次读取实际读取 的长度,因为存在最后一次读取的长度不满buffer的长度的情况,Write()方法,第三个参数是指定写入的长度,这里一般指定Read()方法的返回值,这样就不会出现将多余的无关数据写入文件中。
下面看一下例子:
//读取数据并展示 FileStream fs = new FileStream("./demo.txt", FileMode.Open, FileAccess.Read); int len, i = 0; //存放每次读取的数据 byte[] buffer = new byte[5]; //存放所有读到的数据,最后将其转换为字符串 byte[] data = new byte[fs.Length]; //循环读取文件 while ((len = fs.Read(buffer, 0, buffer.Length)) != 0) { for (int j = 0; j < len; j++) { data[i++] = buffer[j]; } } //jiang Console.WriteLine(Encoding.UTF8.GetChars(data)); //数据写入 FileStream write = new FileStream("./demo_copy.txt", FileMode.Create, FileAccess.Write); //重置指针 fs.Seek(0, SeekOrigin.Begin); while ((len = fs.Read(buffer, 0, buffer.Length)) != 0) { write.Write(buffer, 0, len); } fs.Dispose(); write.Dispose();
第23行用到了一个方法Seek(),这个是用来设置当前文件指针的位置的,一般情况下,文件读到哪指针就指到哪,而通过这个方法,可以重新设置指针的位置,它的第一个参数是偏移量,为正数则向后移动,为负数则向前移动,第二个参数是SeekOrigin枚举,它有三个成员,Begin,End,Current,分别指示文件的开始,结束和当前位置,偏移量根据这个枚举值进行移动。
另外,操作结束后要及时释放资源,或者一开始使用using引用要释放的对象。
这是我的公众号二维码,获取最新文章,请关注此号