C# 文件读取

news2025/4/24 22:01:42

        文件读取是指使用 C# 程序从计算机文件系统中获取文件内容的过程。将存储在磁盘上的文件内容加载到内存中,供程序处理。主要类型有:文本文件读取(如 .txt, .csv, .json, .xml);二进制文件读取(如 .jpg, .png, .exe)。

同步方法

File 

ReadAllText

是 C# 中一个简单易用的文件写入方法,它会创建新文件,如果文件已存在则覆盖。

string path = @"D:\CSharpProject\File\MyTest.txt";
string str = File.ReadAllText(path);

 ReadLines

获取文件中每行数据组成的集合

string path = @"D:\CSharpProject\File\MyTest.txt";
var list = File.ReadLines(path).ToList();
Console.WriteLine(string.Join(",", list));

ReadAllLines

会一次性将整个文本文件的所有行读取到一个字符串数组中。

string path = @"D:\CSharpProject\File\MyTest.txt";
string[] list = File.ReadAllLines(path);
Console.WriteLine(string.Join(",", list));

ReadAllBytes

一个用于读取二进制文件的方法,它会将整个文件内容读取到一个字节数组中。

string path = @"D:\CSharpProject\File\MyTest.txt";
byte[] str = File.ReadAllBytes(path);

StreamReader

StreamReader 是 System.IO 命名空间中的一个类,专门用于从流(如文件流)中读取字符数据。它提供了高效的文本读取能力,特别适合处理大型文本文件。

方法描述
Read()读取下一个字符
ReadLine()读取一行字符
ReadToEnd()读取从当前位置到流末尾的所有内容

简单使用

string path = @"D:\CSharpProject\File\MyTest.txt";
using (StreamReader reader = new StreamReader(path))
{
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}

逐行读取

using (StreamReader reader = new StreamReader("data.txt"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

读取特定数量字符

char[] buffer = new char[100];
using (StreamReader reader = new StreamReader("file.txt"))
{
    int charsRead = reader.Read(buffer, 0, buffer.Length);
    string result = new string(buffer, 0, charsRead);
}

FileStream 

         FileStream 是 System.IO 命名空间中的一个类,提供了对文件进行低级读写操作的能力。与更高级的 StreamReader/StreamWriter 相比,FileStream 提供了更底层的控制,适合处理二进制文件或需要精细控制文件操作的场景。

using System.IO;

string filePath = "example.bin";

// 使用 using 语句确保资源被正确释放
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
    byte[] buffer = new byte[fileStream.Length];
    int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
    
    Console.WriteLine($"读取了 {bytesRead} 字节");
    // 处理 buffer 中的数据...
}

异步方法

File 

ReadAllTextAsync

是ReadAllText的异步实现,功能相同,不会阻塞主线程。

using System.IO;
using System.Threading.Tasks;

public async Task<string> ReadFileContentAsync(string filePath)
{
    return await File.ReadAllTextAsync(filePath);
}

ReadAllLinesAsync

是ReadAllLines的异步实现,功能相同,不会阻塞主线程。

using System.IO;
using System.Threading.Tasks;

public async Task<string[]> ReadFileAsync(string filePath)
{
    return await File.ReadAllLinesAsync(filePath);
}

ReadAllBytesAsync

是ReadAllBytes的异步实现,功能相同,不会阻塞主线程

using System.IO;
using System.Threading.Tasks;

public async Task<byte[]> ReadBinaryFileAsync(string filePath)
{
    return await File.ReadAllBytesAsync(filePath);
}

StreamReader

 简单使用

using System.IO;
using System.Threading.Tasks;

async Task<string> ReadFileAllTextAsync(string filePath)
{
    using (StreamReader reader = new StreamReader(filePath))
    {
        return await reader.ReadToEndAsync();
    }
}

异步逐行读取文件

using (StreamReader reader = new StreamReader("data.txt"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

异步读取指定数量字符

async Task<string> ReadChunkAsync(string path, int chunkSize)
{
    using (var reader = new StreamReader(path))
    {
        char[] buffer = new char[chunkSize];
        int bytesRead = await reader.ReadBlockAsync(buffer, 0, chunkSize);
        return new string(buffer, 0, bytesRead);
    }
}

FileStream 

using System.IO;
using System.Threading.Tasks;

async Task<byte[]> ReadFileFullyAsync(string filePath)
{
    using (FileStream fs = new FileStream(
        filePath, 
        FileMode.Open, 
        FileAccess.Read, 
        FileShare.Read, 
        bufferSize: 4096, 
        FileOptions.Asynchronous)) // 关键选项
    {
        byte[] buffer = new byte[fs.Length];
        await fs.ReadAsync(buffer, 0, buffer.Length);
        return buffer;
    }
}

对比

方法特点适用场景内存效率异步支持典型文件大小
File.ReadAllText一次性读取全部文本小文本文件处理<10MB
File.ReadAllTextAsync异步读取全部文本UI应用读取小文本<10MB
File.ReadAllLines按行读取为数组需要行处理的小文件<10MB
File.ReadAllLinesAsync异步按行读取UI应用需要行处理<10MB
File.ReadAllBytes读取二进制数据图片/音频等二进制文件<50MB
File.ReadAllBytesAsync异步读取二进制UI应用处理二进制<50MB
File.ReadLines延迟行迭代大文本文件处理10MB+
StreamReader灵活文本读取需要控制读取过程有(Async方法)任意大小
FileStream底层二进制读取大文件/随机访问任意大小

选择参考

参考项

推荐方法

场景举例

小文本文件处理 ( < 1MB )

ReadAllText 

ReadAllTextAsync

ReadAllLines 

ReadAllLinesAsync

配置文件读取

小型JSON/XML文件解析

模板文件加载

大文本文件处理 ( > 10MB )

File.ReadLines (LINQ兼容)

StreamReader (逐行处理)

StreamReader.ReadLineAsync (异步逐行)

日志文件分析

大型CSV数据处理

文本文件实时监控

二进制文件处理

File.ReadAllBytes / ReadAllBytesAsync (小文件)

FileStream (大文件)

图片/音视频处理

文件加密/解密

自定义二进制格式解析

同步和异步选择

  1. 使用同步方法

    • 简单的控制台应用程序

    • 需要简单快速完成的小文件操作

    • 在后台线程中执行的文件操作

  2. 使用异步方法

    • UI应用程序(避免界面冻结)

    • Web应用程序和服务(提高并发处理能力)

    • 大文件操作(避免阻塞主线程)

    • 需要响应性的应用程序

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

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

相关文章

leetcode125.验证回文串

class Solution {public boolean isPalindrome(String s) {s s.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();for(int i0,js.length()-1;i<j;i,j--){if(s.charAt(i)!s.charAt(j))return false;}return true;} }

【Android面试八股文】Android系统架构【一】

Android系统架构图 1.1 安卓系统启动 1.设备加电后执行第一段代码&#xff1a;Bootloader 系统引导分三种模式&#xff1a;fastboot&#xff0c;recovery&#xff0c;normal&#xff1a; fastboot模式&#xff1a;用于工厂模式的刷机。在关机状态下&#xff0c;按返回开机 键进…

【数据可视化-21】水质安全数据可视化:探索化学物质与水质安全的关联

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

【prometheus+Grafana篇】从零开始:Linux 7.6 上二进制安装 Prometheus、Grafana 和 Node Exporter

&#x1f4ab;《博主主页》&#xff1a;奈斯DB-CSDN博客 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了解 &#x1f496;如果觉得文章对你有所帮…

STM32(M4)入门:GPIO与位带操作(价值 3w + 的嵌入式开发指南)

一&#xff1a;GPIO 1.1 了解时钟树&#xff08;必懂的硬件基础&#xff09; 在 STM32 开发中&#xff0c;时钟系统是一切外设工作的 “心脏”。理解时钟树的工作原理&#xff0c;是正确配置 GPIO、UART 等外设的核心前提。 1.1.1 为什么必须开启外设时钟&#xff1f; 1. 计…

Linux419 三次握手四次挥手抓包 wireshark

还是Notfound 没连接 可能我在/home 准备配置静态IP vim ctrlr 撤销 u撤销 配置成功 准备关闭防火墙 准备配置 YUM源 df -h 未看到sr0文件 准备排查 准备挂载 还是没连接 计划重启 有了 不重启了 挂载准备 修改配置文件准备 准备清理缓存 ok 重新修改配…

CSS-跟随图片变化的背景色

CSS-跟随图片变化的背景色 获取图片的主要颜色并用于背景渐变需要安装依赖 colorthief获取图片的主要颜色. 并丢给背景注意 getPalette并不是个异步方法 import styles from ./styles.less; import React, { useState } from react; import Colortheif from colorthief;cons…

解决Docker 配置 daemon.json文件后无法生效

vim /etc/docker/daemon.json 在daemon中配置一下dns {"registry-mirrors": ["https://docker.m.daocloud.io","https://hub-mirror.c.163.com","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","ht…

虚幻基础:ue碰撞

文章目录 碰撞&#xff1a;碰撞体 运动后 产生碰撞的行为——碰撞响应由引擎负责&#xff0c;并向各自发送事件忽略重叠阻挡 碰撞响应关系有忽略必是忽略有重叠必是重叠有阻挡不一定阻挡&#xff08;双方都为阻挡&#xff09; 碰撞启用&#xff1a;纯查询&#xff1a;开启移动检…

数据治理体系的“三驾马车”:质量、安全与价值挖掘

1. 执行摘要 数据治理已从合规驱动的后台职能&#xff0c;演变为驱动业务成果的战略核心。本文将深入探讨现代数据治理体系的三大核心驱动力——数据质量、数据安全与价值挖掘——它们共同构成了企业在数字时代取得成功的基石。数据质量是信任的基石&#xff0c;确保决策所依据…

leetcode 二分查找应用

34. Find First and Last Position of Element in Sorted Array 代码&#xff1a; class Solution { public:vector<int> searchRange(vector<int>& nums, int target) {int low lowwer_bound(nums,target);int high upper_bound(nums,target);if(low high…

Ngrok 内网穿透实现Django+Vue部署

目录 Ngrok 配置 注册/登录 Ngrok账号 官网ngrok | API Gateway, Kubernetes Networking Secure Tunnels 直接cmd运行 使用随机生成网址&#xff1a;ngrok http 端口号 使用固定域名生成网址&#xff1a;ngrok http --domain你的固定域名 端口号 Django 配置 1.Youre a…

利用OLED打印调试信息: 控制PC13指示灯点灯的实验

Do口暗的时候才是高电平,因为光敏电阻传感器的高电平是依靠LM393电压比较器上引脚进入高阻态再加上上拉电阻上拉产生的高电平DO口什么时候会输出高阻态?电压比较器的正极输入电压大于负极输入电压,而正极输入电压是光敏电阻分得的电压,光敏电阻的阻值越大,已分得的电压就越大,…

Appium安装 -- app笔记

调试环境&#xff1a;JDK&#xff08;java&#xff09; SDK&#xff08;android&#xff09; Node.js 雷神模拟器&#xff08;或 真机&#xff09; Appium&#xff08;Appium Server【内外件&#xff08;dos内件、界面化工具&#xff09;】、Appium Inspector&#xff09; p…

【OpenGL】OpenGL学习笔记-1:VS2019配置OpenGL开发环境

在Visual Studio 2019中可以通过手动配置库文件或NuGet包管理器快速安装的方法配置OpenGL环境&#xff0c;详细步骤如下&#xff1a; 一、打开VS2019&#xff0c;创建新的控制台项目 二、方法一&#xff1a;手动配置GLEW/GLFW/GLAD库 GLFW是窗口管理和输入事件的基础设施&…

集结号海螺捕鱼游戏源码解析(第二篇):水浒传捕鱼模块逻辑与服务器帧同步详解

本篇将全面解构“水浒传”子游戏的服务端核心逻辑、帧同步机制、鱼群刷新规则、客户端命中表现与服务器计算之间的协同方式&#xff0c;聚焦于 C 与 Unity3D 跨端同步的真实实现过程。 一、水浒传捕鱼模块资源结构 该模块包含三部分核心目录&#xff1a; 子游戏/game_shuihuz…

【音视频】FFmpeg内存模型

FFmpeg内存模型 从现有的Packet拷贝一个新Packet的时候&#xff0c;有两种情况&#xff1a; 两个Packet的buf引用的是同一数据缓存空间&#xff0c;这时候要注意数据缓存空间的释放问题&#xff1b;两个Packet的buf引用不同的数据缓存空间&#xff0c;每个Packet都有数据缓存…

小白自学python第一天

学习python的第一天 一、常用的值类型&#xff08;先来粗略认识一下~&#xff09; 类型说明数字&#xff08;number&#xff09;包含整型&#xff08;int&#xff09;、浮点型&#xff08;float&#xff09;、复数&#xff08;complex&#xff09;、布尔&#xff08;boolean&…

手动实现LinkedList

前言 大家好&#xff0c;我是Maybe。最近在学习数据结构中的链表&#xff0c;自己手动实现了一个LinkedList。我想与大家分享一下。 思维导图 代码部分 package Constant;public class constant {public static final String INDEX_IS_WRONG"输入的下标不合法"; }p…

maven的安装与配置、IDEA集成maven

一、maven的安装与配置环境变量 maven的下载与安装&#xff0c;配置环境变量与验证【附安装包3.6.1&#xff0c;3.8.8&#xff0c;3.9.9】-CSDN博客 参考资料&#xff1a;黑马程序员 二、IDEA集成 2.1 当前工程设置 1. 打开 Maven 设置路径&#xff1a;在 IDEA 中&#xf…