zoukankan      html  css  js  c++  java
  • 关于FileStream读取大文件问题

    小的文本文件(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属性是一个指针,标记文件流当前读写的位置
    代码实现:

     1 using (FileStream fsRead = new FileStream(@"D:Names.txt", FileMode.Open))
     2 {
     3 using (FileStream fsWrite = new FileStream(@"d:	emp.txt", FileMode.Create))
     4 {
     5 byte[] arr = new byte[200];
     6 //记录到底读取了多少字节的数据
     7 int count = 0;
     8 while (fsRead.Position < fsRead.Length)
     9 {
    10 //每一次读取,。返回真正读取到的字节数,用count记录(最后一次读取后可能count可能会小于200)
    11 count = fsRead.Read(arr, 0, arr.Length);
    12 //将数组中的数据写入到指定的文件
    13 fsWrite.Write(arr, 0, count);
    14 }
    15 }
    16 MessageBox.Show("ok");
    17 }
    

     结:

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

    另,任意类型的文件都可以用FileStream来读写

  • 相关阅读:
    如何写一个计算器?
    Web-Scale IT 我之见!
    Django 安全策略的 7 条总结!
    运维安全系列基础服务之 FTP 服务(系列一)
    程序复杂度之圈复杂度
    微信小程序的wx-charts插件-tab选项卡
    微信小程序的wx-charts插件-tab选项卡
    小程序请假效果
    HTTP状态码
    解决微信小程序使用wxcharts在屏幕不固定问题-开发工具里也显示好了布局,为啥到真机就是乱的
  • 原文地址:https://www.cnblogs.com/wywnet/p/5249523.html
Copyright © 2011-2022 走看看