绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
C#中关于FileStream读取大文件问题
2019-10-25 09:40:52

小的文本文件(100M以下)直接用File类的ReadAllText()和WriteAllText()方法

这两个方法内部其实就是封装了StreamReader类的ReadToEnd()和StreamWriter类的WriteToEnd(),

这两个方法的返回值都是string类型,所以只能读写文本文件

小的文本文件的单行读写用StreamReader和StreamWriter这两个类

小的非文本文件用File类的ReadAllBytes()和WriteAllBytes()读写,并用byte[]作中转站

这两个方法内部其实就是封装了FileStream的Read()和Write()方法,

这两个方法的返回值都是byte数组,所以可以读写任何文件

大文件

但File读写特大文件是会出错的,因为它虽然本质上用的是FileStream来读写,但是它的byte[]大小是写死了的(就是被读写文件的大小),所以它是将文件一次性全部读取或写入,文件非常大的时候往往会造成内存溢出,所以要用数据流FileStream,因为我们可以自由定义byte[]的大小,来保证内存不会溢出

一般而言,读文件用FileMode.Open,写文件用FileMode.Create,FileStream的Position属性是一个指针,标记文件流当前读写的位置

代码实现:

using (FileStream fsRead = new FileStream(@"D:\Names.txt", FileMode.Open))

{

using (FileStream fsWrite = new FileStream(@"d:\temp.txt", FileMode.Create))

{

byte[] arr = new byte[200];

//记录到底读取了多少字节的数据

int count = 0;

while (fsRead.Position < fsRead.Length)

{

//每一次读取,。返回真正读取到的字节数,用count记录(后一次读取后可能count可能会小于200)

count = fsRead.Read(arr, 0, arr.Length);

//将数组中的数据写入到指定的文件

fsWrite.Write(arr, 0, count);

}

}

MessageBox.Show("ok");

}

首先看文件大小——如果是大文件则用FileStream,如果是小文件则看是否是文本文件——非文本文件则用File类的 ReadAllBytes/WriteAllBytes,是文本文件则看是否是单行读写——是则用StreamReader类/StreamWriter 类,不是则用File类的ReadAllText/WriteAllText

结论:任意类型的文件都可以用FileStream来读写,避免代码混乱冗余和资源浪费。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

应用开发
创建时间:2020-06-17 15:31:04
应用软件开发是指使用程序语言C#、java、 c++、vb等语言编写,主要是用于商业、生活应用的软件的开发。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~