当前位置: 首页 > 编程日记 > 正文

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

你平时是怎么读取文件的?使用流读取。是的没错,C#给我们提供了非常强大的类库(又一次吹捧了.NET一番),里面封装了几乎所有我们可以想到的和我们没有想到的类,流是读取文件的一般手段,那么你真的会用它读取文件中的数据了么?真的能读完全么?

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

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[] newBuf = 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;

}

using System;
using System.IO;
using System.Collections;

namespace TextFileReader_csharp
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
static void Main(string[] args)
{
StreamReader objReader = new StreamReader("c://test.txt");
string sLine="";
ArrayList arrText = new ArrayList();

while (sLine != null)
{
sLine = objReader.ReadLine();
if (sLine != null)
arrText.Add(sLine);
}
objReader.Close();

foreach (string sOutput in arrText)
Console.WriteLine(sOutput);
Console.ReadLine();
}
}
}

相关文章:

eclipse 默认jdk 的设置 eclipse.ini -vm 参数

2019独角兽企业重金招聘Python工程师标准>>> eclipse 的配置文件 eclipse.ini 不仅仅可以设置eclipse的堆栈内存大小&#xff0c;也可设置默认使用的jdk版本。 一、现有个eclipse 默认启动jdk版本是jdk1.5&#xff0c;需更改为1.6 步骤如下&#xff1a; 方法1&#…

用韩信三技能,讲清楚一致性哈希

作者 | 悟空聊架构来源 | 悟空聊架构头图 | 下载于视觉中国韩信点兵的成语来源淮安民间传说。常与多多益善搭配&#xff0c;寓意越多越好。我们来看下主公刘邦和韩信大将军的对话。刘邦&#xff1a;“你觉得我可以带兵多少&#xff1f;”韩信&#xff1a;“最多十万。”刘邦不解…

有计划地开放数据 促进大数据法规落地

5月1日起&#xff0c;《贵阳市政府数据共享开放条例》正式实施。 《条例》的出台&#xff0c;仅仅是我市大数据发展步入法治轨道的开始。如何更好地让《条例》实现落地&#xff0c;成为新的课题。 2017年1月18日&#xff0c;贵阳市政府数据开放平台正式上线。目前&#xff0c;平…

C#中Base64之编码,解码方法

编码 public string EncodeBase64(string code_type,string code) { string encode ""; byte[] bytes Encoding.GetEncoding(code_type).GetBytes(code); try { encode Convert.ToBase64String(bytes); } catch { encode code; } return encode; }…

自回归与非自回归模型如何兼得?预训练模型BANG或许可解

作者 | 齐炜祯、宫叶云、段楠来源 | 微软研究院AI头条头图 | 下载于视觉中国编者按&#xff1a;近两年&#xff0c;预训练技术的发展极大地提高了自然语言生成的效果&#xff0c;但随着数据量和模型大小的增加&#xff0c;模型在使用时的推断耗时也随之变大。为了降低自回归生成…

STL--自定义类型的排序

STL的排序太坑了&#xff0c;尤其是在VS2010上重载sort函数的第三个比较参数的时候。 invalid operator < 这个错在写多关键字排序的时候就没有停止过。 本来想查书解决&#xff0c;结果各种重载都试了还是不行&#xff0c;百度才知道是因为&#xff1a;strict weak orderin…

《树莓派Python编程指南》——2.3 小结

本节书摘来自华章计算机《树莓派Python编程指南》一书中的第2章&#xff0c;第2.3节,作者&#xff1a;&#xff08;美&#xff09; Alex Bradbury Ben Everard更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.3 小结 我们的Python快速导览到此为止。希望这些程序能…

十年沉浮,用Python看创业公司消亡史

作者 | 叶庭云来源 | 修炼Python头图 | 下载于视觉中国前言IT桔子有一个新经济死亡公司数据库&#xff1a;https://www.itjuzi.com/deathCompany&#xff0c;统计了2000-2020年之间比较出名的公司 "死亡" 数据。"死亡公司数据库" 的公司关闭时间是依据公开…

.NET下正则表达式应用的四个示例

1.确认有效电子邮件格式 下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址&#xff0c;则 IsValidEmail 方法返回 true&#xff0c;否则返回 false&#xff0c;但不采取其他任何操作。您可以使用 IsVali…

static的本质

通过反编译发现&#xff0c;static的本质是abstract sealed。因此&#xff0c;无法继承System.Math类&#xff0c;因为它是static的。转载于:https://www.cnblogs.com/Benjamin/p/3319856.html

Sunrun2016年Q3财务业绩强劲 冲刺全年目标

美国第二大住宅太阳能光伏系统安装商Sunrun&#xff0c;第三季度业绩表现强劲&#xff0c;促使该公司提高其今年的部署前景。Sunrun也采用当下流行的零首付商业模式&#xff0c;从而获取长期收益。 Sunrun2016年Q3财务业绩强劲 冲刺全年目标责任编辑&#xff1a;editor006 作者…

tcpdump移植和使用

tcpdump移植和使用[摘要]&#xff1a;本文主要讲解了tcpdump相关概念和主要参数的使用&#xff0c;并通过事例来讲解tcpdump的用法&#xff0c;最后讲解如何将其移植到嵌入式开发环境&#xff0c;使其在嵌入式主控板中发挥其强大功能。一. tcpdump概念tcpdump就是dump the traf…

在ASP.NET中自动给URL地址加上超链接

作为一个程序员&#xff0c;在完成设计后还要根据程序的情况以及用户的反映不断对程序进行改进&#xff0c;这样才能不断地完善自己的作品。我在制作完软件商务网 http://www.bizsofts.com 的论坛后&#xff0c;发现人们总喜欢在帖子中加上各种有用的URL链接或Email地址。而我当…

释放联接新价值,华为提出“1+N”5G目标网,推动运营商构筑四大数字化转型的核心能力

近日&#xff0c;在MWCS 2021 媒体分析师预沟通会上&#xff0c;华为常务董事、运营商BG总裁丁耘发表了主题为《点亮未来&#xff0c;释放联接新价值》的主题演讲&#xff0c;提出华为将立足联接&#xff0c;通过持续的技术与商业创新&#xff0c;为客户创造价值&#xff0c;为…

光伏电价断崖式下跌 企业遭遇成长烦恼

在弃光限电严重、补贴欠发(三年缺口将达600亿元)、用地问题突显的情况之下&#xff0c;近日&#xff0c;2017年光伏上网电价将酝酿下调近三成&#xff0c;新“四座大山”将蚕食新能源企业的利润。 协合新能源 在香港上市的协合新能源却在不利情况下逆势扩张&#xff0c;营收从2…

asp.net2.0如何加密数据库联接字符串

asp.net2.0如何加密数据库联接字符串 在asp.net2.0中,发布网站时,加密web.config,这样可以有效保证数据库用户和密码安全,其步骤如下: 1.添加密钥 执行:C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis -pc "hnlaw" -exp 其中"hnlaw"为密钥名…

机器学习 KNN算法实践

作者 | 叶庭云来源 | 修炼Python头图 | 下载于视觉中国KNN算法简介KNN&#xff08;K-Nearest Neighbor&#xff09;最邻近分类算法是数据挖掘分类&#xff08;classification&#xff09;技术中常用算法之一&#xff0c;其指导思想是"近朱者赤&#xff0c;近墨者黑"&…

【生活随想】实习结束以及开始校园招聘

我发现很多时候我处理事情的思维是局限的&#xff01;就拿前几天辞职的事情来说吧&#xff0c;我原打算直接向公司辞职&#xff0c;但后来听同学说“还是先试着向公司请假比较好”&#xff0c;不用细想也是&#xff0c;如果公司同意我请假&#xff0c;我还能给自己留一条后路&a…

《21世纪机器人》一一第1章 他用自己的思想打造机器人

第1章 他用自己的思想打造机器人 我在前面说过&#xff0c;这本书的结尾是吉米站在后台&#xff0c;准备闪亮登场&#xff0c;这是他的首次亮相。当我把吉米的这张照片发给我太太时&#xff0c;她很快回复&#xff1a;“这真的是用你的思想打造出的机器人&#xff01;&#xff…

牛年快乐~新一年从甜蜜的烘焙里学AI

作者 | 神经小兮来源 | HyperAI超神经头图 | 下载于视觉中国经过数千年的积累&#xff0c;人类已经开发出了各色美味&#xff0c;但我们的味蕾却永远不知满足。谷歌一位 AI 开发者&#xff0c;为了探索新的可能&#xff0c;用 AI 来开发新的甜点食谱。AI 在菜谱开发这一领域&am…

Datalist控件,Repeater控件如何分页?

Asp.net提供了三个功能强大的列表控件&#xff1a;DataGrid、DataList和Repeater控件&#xff0c;但其中只有DataGrid控件提供分页功能。相对DataGrid&#xff0c;DataList和Repeater控件具有更高的样式自定义性&#xff0c;所以很多时候我们喜欢使用DataList或Repeater控件来显…

java List集合中contains方法总是返回false

ArrayList的contains方法 java 今天在用ArrayList类的caontains方法是遇到了问题&#xff0c;我写了一个存放User类的ArrayList 但在调用list.contains(user)时总是返回false。 去看了下ArrayList的源码&#xff0c;源码如下&#xff1a; Java代码 public boolean contains…

营销自动化的4大预测分析错误

预测分析是数字营销的新领域。许多专家已经讨论了将预测分析与营销自动化工具&#xff08;如HubSpot和Marketo&#xff09;合并的好处。 将预测分析整合到用户的营销自动化策略中可能非常有益&#xff0c;但也很难执行。以下是可能会阻止其实施的一些常见的错误&#xff1a; 1.…

Prolog学习:数独和八皇后问题

上一篇简单介绍了下Prolog的一些基本概念&#xff0c;今天我们来利用这些基本概念解决两个问题&#xff1a;数独和八皇后问题。 数独 数独是一个很经典的游戏&#xff1a; 玩家需要根据nn盘面上的已知数字&#xff0c;推理出所有剩余空格的数字&#xff0c;并满足每一行、每一列…

每年节省170万美元的文档预览费用,借助机器学习的DropBox有多强​?

【CSDN 编者按】Dropbox 借助机器学习的预测功能&#xff0c;每年能为公司节省了一百多七十多万美元的基础架构成本。非常了不起的成就。本文&#xff0c;一起来看一看 Dropbox 采用机器学习的经过&#xff0c;以及分析一下其中的利弊。译者 | 弯月 责编 | 张文出品 | CSDN&a…

asp.net 对xml文件的读写,添加,修改,删除操作

asp.net 对xml文件的读写,添加,修改,删除操作 下面有代码调试正确 using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using…

阿里重金投数梦工场 布局PaaS动了谁的奶酪

就目前云计算市场来看&#xff0c;巨头的争夺表面上还在IaaS激战&#xff0c;但实际上他们对PaaS也在默默布局。6月8日&#xff0c;PaaS相关服务商数梦工场宣布完成光大实业资本、阿里巴巴等公司共同投资的7.5亿元A轮融资。值得注意的是&#xff0c;阿里巴巴是几位投资方中唯一…

ASP.net中太长的数据缩略显示

问题&#xff1a;用<%# DataBinder.Eval(Container.DataItem,"NewsID"&#xff09;%>显示数据的&#xff0c;如果标题太长了怎么规定字数&#xff0c;多余的用"..."代替解决方法&#xff1a; 1.使用后台代码解决&#xff1a; cs文件代码&#xff1a;…

再见 for 循环!pandas 提速 315 倍~

for是所有编程语言的基础语法&#xff0c;初学者为了快速实现功能&#xff0c;依懒性较强。但如果从运算时间性能上考虑可能不是特别好的选择。本次东哥介绍几个常见的提速方法&#xff0c;一个比一个快&#xff0c;了解pandas本质&#xff0c;才能知道如何提速。下面是一个例子…

UVa 374 - Big Mod

题目大意&#xff1a;计算R BP mod M&#xff0c;根据模运算的性质计算。 正常计算会超时&#xff0c;可以用分治的思想降低时间复杂度。不过如果遇到00&#xff0c;结果...话说00的结果是1吗&#xff1f;忘了都... 1 #include <cstdio>2 3 int powMod(int base, int ex…