利用C#进行文件读写的方法选择总结
2015-10-08 13:01
561 查看
小的文本文件(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属性是一个指针,标记文件流当前读写的位置
代码实现:
总结:
首先看文件大小——如果是大文件则用FileStream,如果是小文件则看是否是文本文件——非文本文件则用File类的ReadAllBytes/WriteAllBytes,是文本文件则看是否是单行读写——是则用StreamReader类/StreamWriter类,不是则用File类的ReadAllText/WriteAllText
另,任意类型的文件都可以用FileStream来读写
这两个方法内部其实就是封装了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来读写
相关文章推荐
- C#写快速排序
- C#中@符号的用法
- C#索引器的用法
- c# 可空 null ? ??
- C#中三种弹出信息窗口的方式
- .net c#线程使用心得
- C#单元测试面面观
- C# BackgroundWorker的使用
- C#中的线程(一)入门
- C#进阶系列——MEF实现设计上的“松耦合”(四):构造函数注入
- C#.net支付宝接口
- C# 如何将List拆分成多个子集合
- C#读取PDF文档内容
- C#中泛型集合List<T>反序列化问题及解决方法
- C#学习之多线程开发技术(十四)
- C# 代理用法
- C# 客户端调用web服务 wsdl转成dll调用
- 【C#】让ListBox控件支持双击事件
- c#,使用WPF的Adorner实现iPhone上新邮件或消息提示效果----实现(二)
- c#,使用WPF的Adorner实现iPhone上新邮件或消息提示效果----实现(一)