千家信息网

如何使用C#读取文件更有效率

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,小编给大家分享一下如何使用C#读取文件更有效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通常我们用C#读取文件一个文件
千家信息网最后更新 2025年11月08日如何使用C#读取文件更有效率

小编给大家分享一下如何使用C#读取文件更有效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

通常我们用C#读取文件一个文件使用如下的步骤:

1、声明并使用File的OpenRead实例化一个文件流对象,就像下面这样

FileStream fs = File.OpenRead(filename);

或者

FileStream fs = FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);

2、准备一个存放文件内容的字节数组,fs.Length将得到文件的实际大小,就像下面这样

byte[] data = new byte[fs.Length];

3、哇!开始读了,调用一个文件流的一个方法读取数据到data数组中

fs.Read (data, 0, data.Length);

我们只写了3句就可以把文件里面的内容原封不动的读出来,真是太简洁了!可以这段代码真的能像你预期的那样工作么?答案是:几乎可以!在大部分情况下上面的代码工作的很好,但是我们应该注意Read方法是有返回值的,既然有返回值那么一定有其道理,如果按照上面的写法完全可以是一个没有返回值的函数。我想返回值的目的是,为了给我们一个机会判断实际读取文件的大小,从而来判断文件是否已经完全读完。所以上面的代码不能保证我们一定读完了文件里面的所有字节(虽然在很多情况下是读完了)。下面的方法提供了一个比上面方法更安全的方法,来保证文件被完全读出

public static void SafeRead (Stream stream, byte[] data){      int offset=0;      int remaining = data.Length;         // 只要有剩余的字节就不停的读      while (remaining > 0){          int read = stream.Read(data, offset, remaining);          if (read <= 0)              throw new EndOfStreamException("文件读取到"+read.ToString()+"失败!");                // 减少剩余的字节数          remaining -= read;                // 增加偏移量          offset += read;      }  }

有些情况下你不知道流实际的长度比如:网络流。此时可以使用类似的方法读取流直到流里面的数据完全读取出来为止。我们可以先初始化一段缓存,再将流读出来的流信息写到内存流里面,就像下面这样:

public static byte[] ReadFully (Stream stream){         // 初始化一个32k的缓存      byte[] buffer = new byte[32768];      using (MemoryStream ms = new MemoryStream()){ //返回结果后会自动回收调用该对象的Dispose方法释放内存                // 不停的读取          while (true){              int read = stream.Read (buffer, 0, buffer.Length);                       // 直到读取完***的3M数据就可以返回结果了              if (read <= 0)                  return ms.ToArray();              ms.Write (buffer, 0, read);          }      }  }

虽然上面的例子都比较简单,效果也不是很明显(大部分都是对的),也许你早就会了,没关系这篇文章本来就是写给初学者的。

下面的方法提供了一种使用指定缓存长度的方式读取流,虽然在很多情况下你可以直接使用Stream.Length得到流的长度,但是不是所有的流都可以得到。

public static byte[] Read2Buffer (Stream stream, int BufferLen){         // 如果指定的无效长度的缓冲区,则指定一个默认的长度作为缓存大小         if (BufferLen < 1){                BufferLen = 0x8000;         }         // 初始化一个缓存区         byte[] buffer = new byte[BufferLen];         int read=0;            int block;         // 每次从流中读取缓存大小的数据,知道读取完所有的流为止         while ( (block = stream.Read(buffer, read, buffer.Length-read)) > 0){                // 重新设定读取位置                read += block;                 // 检查是否到达了缓存的边界,检查是否还有可以读取的信息                if (read == buffer.Length){                       // 尝试读取一个字节                       int nextByte = stream.ReadByte();                             // 读取失败则说明读取完成可以返回结果                       if (nextByte==-1){                              return buffer;                       }                       // 调整数组大小准备继续读取                       byte[] newnewBuf = new byte[buffer.Length*2];                       Array.Copy(buffer, newBuf, buffer.Length);                       newBuf[read]=(byte)nextByte;                       buffer = newBuf;// buffer是一个引用(指针),这里意在重新设定buffer指针指向一个更大的内存                       read++;                }         }         // 如果缓存太大则使用ret来收缩前面while读取的buffer,然后直接返回         byte[] ret = new byte[read];         Array.Copy(buffer, ret, read);         return ret;  }

以上是"如何使用C#读取文件更有效率"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

文件 方法 面的 缓存 字节 长度 内容 大小 情况 篇文章 C# 代码 内存 大部分 实际 数据 数组 结果 有效 有效率 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全知识讲座主题 供热收费系统网络安全 信捷plc采集的数据导到数据库 服务器给其他人管理 的指令 万维网络安全考试答案 人工智能与网络安全的构想 软件开发英语怎么读 有什么手机招聘软件开发 河北省网络安全工作会议讲话 简历数据库尽快回复通知 软件开发整套流程文件 sql数据库注册存储 浏览器和服务器之间的协议是什么 成都八年软件开发经验工资 明日之后更新服务器无法连接 锐思数据库有专利申请数据 金蝶数据库备份在哪里看 云杨网络技术有限公司招聘 网络技术的资料 连接战网服务器为什么那么多 市公积金中心开展网络安全检查 上海邮乐网络技术公司 四川党员教育软件开发系统 哪里数据库作业比较好 安卓app软件开发代理 腾讯云服务器放开全部安全组 sql数据库相同字段替换 网络安全黑板报漂亮 系统备份软件开发 wow+美服数据库
0