使用FileStream读写数据

    这节讲一下使用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引用要释放的对象。

这是我的公众号二维码,获取最新文章,请关注此号

原文地址:https://www.cnblogs.com/charlesmvp/p/13603528.html