C# 上位机开发中实现文本读取的7种方式

117 阅读7分钟

前言

在 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

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!