前言
在 C# 上位机开发中,文本读取功能可以通过多种方式实现,本文详细介绍了 7 种常见的方法,并对其进行了测试与分析。
掌握多种文本读取方法,对于 C# 上位机开发来说至关重要。
正文
这里我们先写好了一个测试界面,提供一个文件路径选择的入口,具体如下所示:
方式一
基于FileStream,并结合它的Read方法读取指定的字节数组,最后转换成字符串进行显示。
this.rtb_Content.Clear();
FileStream fs = new FileStream(this.txt_FilePath.Text, FileMode.Open, FileAccess.Read);
int n = (int)fs.Length;
byte[] b = new byte[n];
int r = fs.Read(b, 0, n);
fs.Close();
this.rtb_Content.Text = Encoding.UTF8.GetString(b, 0, n);
优点
能够精确控制读取的字节数,适用于需要按特定长度读取文件内容的场景,可有效减少内存消耗,提高读取效率,尤其适合读取大文件。
缺点
代码较为繁琐,需要手动管理字节数组和文件流的关闭,对编码方式的处理不够灵活,若文件编码不是 UTF-8 可能会导致读取错误。
方式二
基于FileStream,一个字节一个字节读取,放到字节数组中,最后转换成字符串进行显示。
this.rtb_Content.Clear();
FileStream fs = new FileStream(this.txt_FilePath.Text, FileMode.Open, FileAccess.Read);
long n = fs.Length;
byte[] b = new byte[n];
int data, index;
index = 0;
data = fs.ReadByte();
while (data != -1)
{
b[index++] = Convert.ToByte(data);
data = fs.ReadByte();
}
fs.Close();
this.rtb_Content.Text = Encoding.UTF8.GetString(b);
优点
可以逐字节读取文件,对于一些需要逐字节处理文件内容的特殊情况较为适用,如对文件进行加密、解密等操作时,可逐字节进行处理。
缺点
效率较低,每次读取一个字节并进行转换,对于大文件读取速度较慢,且同样存在编码处理不够灵活的问题,代码实现也相对复杂。
方式三
基于File类,直接全部读取出来并显示。
this.rtb_Content.Clear();
this.rtb_Content.Text = File.ReadAllText(this.txt_FilePath.Text, Encoding.UTF8);
优点
代码简洁明了,一行代码即可完成整个文件的读取,对于读取较小的文本文件非常方便快捷,易于理解和使用。
缺点
当文件较大时,会一次性将文件内容全部加载到内存中,可能导致内存溢出,无法有效处理大文件,且无法实现按行或其他方式的逐步读取。
方式四
基于StreamReader,一行一行读取,最后拼接并显示。
this.rtb_Content.Clear();
StreamReader sr = new StreamReader(this.txt_FilePath.Text, Encoding.UTF8);
string line = sr.ReadLine();
while (line != null)
{
this.rtb_Content.AppendText(line);
line = sr.ReadLine();
if (line != null)
{
this.rtb_Content.AppendText("rn");
}
}
sr.Close();
优点
可以逐行读取文件内容,便于对每一行进行单独处理,如数据解析、格式化等,适合读取按行分隔的文本文件,如日志文件、配置文件等。
缺点
需要手动管理 StreamReader 的关闭,且在读取过程中需要逐行拼接字符串,对于大文件可能会导致一定的性能开销。
方式五
基于StreamReader,一次性读取到结尾,最后显示。
this.rtb_Content.Clear();
StreamReader sr = new StreamReader(this.txt_FilePath.Text, Encoding.UTF8);
this.rtb_Content.Text = sr.ReadToEnd();
sr.Close();
优点
代码简洁,能够一次性读取文件到结尾,与方式三类似,但通过 StreamReader 实现,可更好地处理文本文件的编码问题。
缺点
同样存在内存溢出的风险,不适合读取大文件,且无法实现逐行处理。
方式六
基于StreamReader,一行一行读取,通过EndOfSteam判断是否到结尾,最后拼接并显示。
this.rtb_Content.Clear();
StreamReader sr = new StreamReader(this.txt_FilePath.Text, Encoding.UTF8);
while (!sr.EndOfStream)
{
this.rtb_Content.AppendText(sr.ReadLine());
if (!sr.EndOfStream)
{
this.rtb_Content.AppendText("rn");
}
}
sr.Close();
优点
通过 EndOfStream 属性判断是否读取到文件结尾,可灵活控制读取过程,与方式四类似,但使用 EndOfStream 可能更直观地表示读取进度。
缺点
与方式四相同,需要手动管理资源关闭,且逐行拼接字符串可能影响性能。
方式七
基于FileStream和StreamReader来实现。
this.rtb_Content.Clear();
FileStream fs = new FileStream(this.txt_FilePath.Text, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.UTF8);
this.rtb_Content.Text = sr.ReadToEnd();
fs.Close();
sr.Close();
优点
结合了 FileStream 和 StreamReader 的优势,既可以利用 FileStream 精确控制文件访问,又能借助 StreamReader 方便地读取文本内容,较为灵活。
缺点
需要关闭两个对象(FileStream 和 StreamReader),若未正确关闭可能会导致资源泄露,代码实现相对复杂。
测试结果
经过测试,以上每个方法都可以实现文本文件的读取。
总结
本文介绍了 7 种 C# 上位机开发中实现文本读取的方式,这些方式主要基于 FileStream、File 和 StreamReader 这三个类,它们各有特点与适用场景。
1、FileStream
一个功能强大的类,能够对任意类型的文件进行读取操作。
它的优势在于可以灵活地指定每次读取的字节长度,这在处理大文件时尤为重要。
通过精确控制读取的字节数,可以有效减少内存的消耗,从而显著提高读取效率。
例如,在方式一和方式二中,我们利用 FileStream 的 Read 方法和 ReadByte 方法,分别实现了按指定字节数组读取和逐字节读取文件内容,这两种方法都能够在不同场景下满足特定的读取需求。
2、StreamReader
该类专为文本文件的读写操作设计,其核心特点是能够方便地实现按行读取文本内容。
对于处理以行为单位组织数据的文件(如日志文件、配置文件等)非常有用。
在方式四、方式五、方式六和方式七中,我们通过 StreamReader 的 ReadLine 方法和 ReadToEnd 方法,展示了如何逐行读取文件以及一次性读取整个文件内容。
这些方法不仅代码简洁,而且能够很好地处理文本文件的编码问题,确保读取的准确性。
3、File
一个静态类,File 提供一系列便捷的静态方法来执行文件读写操作。这些方法背后实际上封装了 FileStream、StreamReader 等对象的实例化和操作过程。
例如,File.ReadAllText 方法(方式三)内部实际上是创建了一个 StreamReader 对象来读取文件内容,然后将读取到的文本返回。
这种方式的优点在于代码极其简洁,无需关心底层的流管理细节,能够快速实现文件的读取功能。
然而,这种简洁性也带来了一定的局限性,如在处理大文件时可能会面临内存溢出的风险,因为它会一次性将整个文件内容加载到内存中。
综上所述,FileStream、StreamReader 和 File 这三个类在 C# 上位机开发中用于文本读取时各有优势。
FileStream 适合需要精细控制读取过程和优化内存使用的场景;
StreamReader 适用于按行处理文本文件,能够简化文本读取操作并保证编码正确性;
而 File 类则提供了最简便的文件读取方式,但在处理大文件时需谨慎使用。
可以根据具体的项目需求和文件特性,灵活选择最适合的文本读取方法,以实现高效、稳定且易于维护的上位机应用。
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!
作者:dotNet工控上位机
出处:mp.weixin.qq.com/s/z8yd2Kwo5cRwY4Tzz0EJlg
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!