C#如何快速读取大型文本文件?StreamReader+FileStream

FileStream读取字节流, StreamReader则是用于从字节流中读取文本数据并进行解码。

  1. FileStream用于打开文件流,提供了对文件的底层访问,它读取的是字节流。

  2. StreamReader用于从字节流中读取文本数据,并根据指定的编码(或使用默认编码)进行解码,以便读取文本内容

因此,StreamReader实际上是在FileStream之上建立的一个文本读取器,它提供了更方便的文本读取功能,可以直接读取文本数据,而无需手动进行字节到文本的解码操作。

using System;
using System.IO;class Program
{static void Main(){string filePath = "large_text_file.txt";// 根据不同的缓冲区大小进行测试int[] bufferSizes = { 1024, 4096, 8192, 16384 }; // 1KB, 4KB, 8KB, 16KBforeach (int bufferSize in bufferSizes){Console.WriteLine($"Testing with buffer size: {bufferSize} bytes");// 测试读取文件所需时间DateTime startTime = DateTime.Now;ReadFile(filePath, bufferSize);DateTime endTime = DateTime.Now;TimeSpan elapsedTime = endTime - startTime;Console.WriteLine($"Time taken: {elapsedTime.TotalMilliseconds} ms\n");}Console.ReadLine();}static void ReadFile(string filePath, int bufferSize){using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize)){using (StreamReader reader = new StreamReader(fileStream)){string line;while ((line = reader.ReadLine()) != null){// 模拟处理每一行的逻辑// 在这里可以对读取的行进行处理,例如输出到控制台或写入另一个文件}}}}
}

 -------------------

尝试使用异步读取文件的方式,可以进一步提高性能。用 StreamReader.ReadLineAsync() 方法来实现异步读取。
使用 Stopwatch 类来更加准确地计时,因为 DateTime.Now 受系统时钟的精度和影响,可能不够准确。

using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;class Program
{static async Task Main(){string filePath = "large_text_file.txt";// 根据不同的缓冲区大小进行测试int[] bufferSizes = { 1024, 4096, 8192, 16384 }; // 1KB, 4KB, 8KB, 16KBforeach (int bufferSize in bufferSizes){Console.WriteLine($"Testing with buffer size: {bufferSize} bytes");// 测试读取文件所需时间Stopwatch stopwatch = Stopwatch.StartNew();await ReadFileAsync(filePath, bufferSize);stopwatch.Stop();TimeSpan elapsedTime = stopwatch.Elapsed;Console.WriteLine($"Time taken: {elapsedTime.TotalMilliseconds} ms\n");}Console.ReadLine();}static async Task ReadFileAsync(string filePath, int bufferSize){using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous)){using (StreamReader reader = new StreamReader(fileStream)){string line;while ((line = await reader.ReadLineAsync()) != null){// 模拟处理每一行的逻辑// 在这里可以对读取的行进行处理,例如输出到控制台或写入另一个文件}}}}
}

----------------

流(Stream)和缓冲区(Buffer)是在处理文件和数据时经常遇到的概念。

1. **流(Stream)**:流是一种用于在程序之间传输数据的抽象概念。它表示一个序列的数据元素,并且通常以字节的形式处理。流可以是输入流(用于读取数据)或输出流(用于写入数据),也可以是双向的。流可以与各种数据源和目标交互,例如文件、内存、网络连接等。在C#中,`Stream`类是流的抽象基类,它定义了许多用于处理字节数据的方法和属性。

2. **缓冲区(Buffer)**:缓冲区是指一块内存区域,用于临时存储数据。在文件或网络传输中,数据通常会通过缓冲区进行读取和写入。使用缓冲区可以减少对数据源的频繁访问,提高读写的效率。在C#中,缓冲区通常是一个字节数组,大小根据需要调整以适应特定的场景。在文件IO操作中,使用缓冲区可以减少对磁盘的频繁访问,提高读写性能。

流和缓冲区通常一起使用,特别是在处理大型数据或文件时。通过将流与缓冲区结合使用,可以实现高效的数据读写操作。在读取文件时,可以使用缓冲区来批量读取数据,减少对磁盘的IO操作次数;在网络传输中,可以使用缓冲区来临时存储传输的数据,以提高传输效率。

----------

`StreamReader`是C#中用于从流中读取文本的类之一。它提供了许多方便的方法来读取文本数据,尤其适用于处理大型文本文件。以下是`StreamReader`的一些重要特性和用法:

1. **构造函数**:`StreamReader`有多个重载的构造函数,其中最常用的一个接受一个`Stream`对象作为参数。这允许你从任何类型的流(如文件流、内存流或网络流)中读取文本数据。

2. **Read方法**:`Read`方法用于读取单个字符,并返回其Unicode代码。如果到达流的末尾,则返回-1。这个方法通常不是用来读取大量数据的首选方法,因为它会导致大量的IO操作,效率较低。

3. **ReadLine方法**:`ReadLine`方法用于逐行读取文本数据。每次调用`ReadLine`方法都会读取流中的下一行,并返回一个字符串,表示该行的内容。当到达流的末尾时,`ReadLine`方法会返回`null`。

4. **ReadToEnd方法**:`ReadToEnd`方法用于从当前位置读取流的剩余部分,并将其作为单个字符串返回。这在需要读取整个文件的情况下非常有用。

5. **Close方法**:`Close`方法用于关闭`StreamReader`对象,并释放关联的资源。在不再需要使用`StreamReader`对象时,应该调用`Close`方法以释放资源。

`StreamReader`是处理文本数据时的常用工具,它提供了方便的方法来逐行读取文本文件,并且可以与各种类型的流一起使用。在处理大型文本文件时,使用`StreamReader`可以提高读取效率,并减少对系统资源的消耗。

------------------

`FileStream`是C#中用于与文件进行交互的类之一它允许你在文件中进行读取和写入操作。以下是`FileStream`的一些重要特性和用法:

1. **构造函数**:`FileStream`有多个重载的构造函数,其中最常用的一个接受文件路径和文件打开模式作为参数。通过指定文件路径和打开模式,你可以创建一个`FileStream`对象来读取或写入指定的文件。

2. **文件打开模式**:`FileStream`的构造函数允许你指定文件的打开模式,如`FileMode.Open`、`FileMode.Create`、`FileMode.Append`等。这决定了文件的打开方式,例如是否允许读取、写入、创建文件等。

3. **读取和写入操作**:`FileStream`提供了许多方法来进行文件的读取和写入操作,例如`Read`、`Write`、`ReadAsync`、`WriteAsync`等。这些方法允许你以字节的形式读取或写入文件的内容。

4. **Seek方法**:`Seek`方法允许你在文件中定位到指定的位置。通过调用`Seek`方法,你可以在文件中移动文件指针,并设置读取或写入的位置。

5. **Close方法**:`Close`方法用于关闭`FileStream`对象,并释放关联的资源。在不再需要使用`FileStream`对象时,应该调用`Close`方法以释放资源。

`FileStream`是处理文件IO操作时的常用工具,它提供了丰富的方法和属性来实现对文件的读取和写入操作。与其他流类似,`FileStream`也可以与`StreamReader`或`StreamWriter`等其他流一起使用,以便更方便地处理文本数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题目:一个最优美的图案。

题目:一个最优美的图案。    There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should l…

Spring Boot统一功能处理(一)

本篇主要介绍Spring Boot的统一功能处理中的拦截器。 目录 一、拦截器的基本使用 二、拦截器实操 三、浅尝源码 初始化DispatcherServerlet 处理请求(doDispatch) 四、适配器模式 一、拦截器的基本使用 在一般的学校或者社区门口,通常会安排几个…

(我的创作纪念日)[MySQL]数据库原理7——喵喵期末不挂科

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

软考系统架构设计师考试论文应试技巧

写论文是你展示系统分析水平的最佳时机,如果您面对三个论文问题的阐述,怎么才能让人相信你有项目实践经验,有较强的分析问题、解决问题的能力,怎么才能让你的论文就很有说服力呢?下面是湖北软考网小编总结出来的几条系…

无酒不水浒,无肉不江湖

很难想象,没有酒的《水浒传》,将会是什么样儿? 武松醉打蒋门神,小霸王醉入销金帐、杨雄醉骂潘巧云,诸如此类,都是水浒传中经典的酒故事,倘若离开了酒,水浒少的就不仅仅是故事了&…

头歌-机器学习实验 第8次实验 决策树

第1关:什么是决策树 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务,你需要掌握决策树的相关基础知识。 引例 在炎热的夏天,没有什么比冰镇后的西瓜更能令人感到心旷神怡的了。现…

【nnUNetv2进阶】三、nnUNetv2 自定义网络-发paper必会

nnUNet是一个自适应的深度学习框架,专为医学图像分割任务设计。以下是关于nnUNet的详细解释和特点: 自适应框架:nnUNet能够根据具体的医学图像分割任务自动调整模型结构、训练参数等,从而避免了繁琐的手工调参过程。 自动化流程:nnUNet包含了从数据预处理到模型训练、验证…

【Linux实践室】Linux高级用户管理实战指南:用户所属组变更操作详解

🌈个人主页:聆风吟_ 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 🔔Linux查看用户所属组2.1.1 👻使…

《UE5_C++多人TPS完整教程》学习笔记31 ——《P32 角色移动(Character Movement)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P32 角色移动(Character Movement)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者&…

IntelliJ IDEA 2024 for Mac/Win:引领Java开发新纪元的高效集成环境

在日新月异的软件开发领域,一款高效、智能的集成开发环境(IDE)无疑是程序员们不可或缺的神兵利器。今天,我要为大家介绍的,正是这样一款集大成之作——IntelliJ IDEA 2024。无论是Mac用户还是Windows用户,只…

全球AI顶会NeurlPS开始收高中生论文了

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 卷高考之后的下一步,卷论文? 培养 AI 人才,要从娃娃抓起&…

Spark-Scala语言实战(16)

在之前的文章中,我们学习了三道任务,运用之前学到的方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战&#x…

逆向案例二十五——m3u8中有AES加密怎么处理

网址链接:aHR0cHM6Ly93d3cuY2Jwb3J0YWwub3JnL2N1cGZveHBsYXkvODUyNzctMS0xLw 打开一个视频,打开开发者工具,刷新,搜索m3u8,找到这个含有所有ts连接的包 预览一下: 这与平常的m3u8有所不同,如果有下面的代码…

基于torch的图像识别训练策略与常用模块

数据预处理部分: 数据增强:torchvision中transforms模块自带功能,比较实用数据预处理:torchvision中transforms也帮我们实现好了,直接调用即可DataLoader模块直接读取batch数据 网络模块设置: 加载预训练…

【SQL】数据库SQL语句

1、主键 主键值唯一,不可修改,不能为空,删除不能重用 2、数据类型(常用) char int float date timestamp 3、select select * from data; select xx,xxx from data;//取部分行 select * from data limit 100; //限…

Bezier曲线的绘制 matlab

式中: 称为基函数。 。 因为n表示次数,点数为n1,显然i表示第i个控制点。 显然在Matlab中可以同矩阵的形式来计算C(u)。 关键代码为: clc clear % 假设控制点P取值为: P [4,7;13,12;19,4;25,12;30,3]; % 因此&a…

vscode debug 配置:launch.json

打开新项目左边的“运行和调试” 点击蓝色字体“创建 launch.json 文件” 选择上方“python” 选择“Python 文件 调试当前正在运行的Python文件” 配置launch.json文件内容: {// 使用 IntelliSense 了解相关属性// 悬停以查看现有属性的描述。// 欲了解更多信息&a…

设计模式-单一职责原则

基本介绍 对类来说的,即一个类应该只负责一项职责。如类A负责两个不同的职责,职责1,职责2.当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2 应用实例 方案1 public cl…

大厂MVP技术JAVA架构师培养

课程介绍 这是一个很强悍的架构师涨薪计划课程,课程由专家级MVP讲师进行教学,分为是一个章节进行分解式面试及讲解,不仅仅是面试,更像是一个专业的架构师研讨会课程。课程内容从数据结构与算法、Spring Framwork、JVM原理、 JUC并…