filestream类怎么用?filestream类读取文件乱码怎么办

FileStream 是 .NET 框架中用于对文件进行字节级别读写的核心类,它位于 System.IO 命名空间下。

StreamReader/StreamWriter(处理文本)不同,FileStream 处理的是原始字节(byte[]),因此它可以用于读写任何类型的文件,包括文本文件、图片、音频、视频、序列化对象等。

92. 二进制文件的读写(FileStream类)
加载中
92. 二进制文件的读写(FileStream类)

基本用法

创建 FileStream 对象

构造函数通常接收文件路径、访问模式(读/写/追加)、共享模式等参数。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string filePath = "example.txt";
        // 1. 写入文件(如果文件存在则覆盖,不存在则创建)
        using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        {
            byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");
            fs.Write(data, 0, data.Length);
        }
        // 2. 读取文件
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            string content = System.Text.Encoding.UTF8.GetString(buffer);
            Console.WriteLine(content); // 输出: Hello, FileStream!
        }
    }
}

注意using 语句确保 FileStream 在使用后自动调用 Dispose(),从而释放文件句柄和内存资源。


关键枚举参数

FileMode(文件模式)

filestream类怎么用?filestream类读取文件乱码怎么办

说明
CreateNew 创建新文件,如果文件已存在则抛出异常
Create 创建新文件,如果文件已存在则覆盖
Open 打开现有文件,如果文件不存在则抛出异常
OpenOrCreate 如果存在则打开,否则创建
Truncate 打开现有文件并清空内容(长度变为0),必须配合 FileAccess.Write
Append 打开文件并将指针移到末尾,用于追加内容,必须配合 FileAccess.Write

FileAccess(访问权限)

说明
Read 只读
Write 只写
ReadWrite 可读可写

FileShare(共享模式)

说明
None 独占访问,其他进程无法打开该文件
Read 允许其他进程读取
Write 允许其他进程写入
ReadWrite 允许其他进程读写

常用方法

方法 说明
Write(byte[] buffer, int offset, int count) 将字节数组写入流
Read(byte[] buffer, int offset, int count) 从流中读取字节到数组,返回实际读取的字节数
Seek(long offset, SeekOrigin origin) 移动当前文件指针位置
Flush() 清除缓冲区,将所有数据写入底层设备
Close() / Dispose() 关闭流并释放资源

filestream类怎么用?filestream类读取文件乱码怎么办

Seek 示例:随机访问文件

using (FileStream fs = new FileStream("data.bin", FileMode.Open, FileAccess.ReadWrite))
{
    // 移动到文件第100个字节处
    fs.Seek(100, SeekOrigin.Begin);
    byte[] data = new byte[10];
    fs.Read(data, 0, 10); // 从第100字节开始读取10个字节
}

异步操作(推荐用于高性能场景)

在 I/O 密集型应用中(如 Web 服务器、大文件传输),建议使用异步方法以避免阻塞线程。

static async Task CopyFileAsync(string sourcePath, string destPath)
{
    using (FileStream sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true))
    using (FileStream destStream = new FileStream(destPath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true))
    {
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
        {
            await destStream.WriteAsync(buffer, 0, bytesRead);
        }
    }
}

提示:从 .NET Core 2.0 / .NET Standard 2.1 开始,FileStream 构造函数支持 useAsync: true 参数,启用后内部使用异步 I/O 完成端口,性能更优。


与 StreamReader/StreamWriter 的区别

filestream类怎么用?filestream类读取文件乱码怎么办

特性 FileStream StreamReader/StreamWriter
数据类型 字节(byte 字符(char)/ 字符串
编码处理 需手动指定编码(如 UTF8) 自动处理编码
适用场景 二进制文件(图片、音频、视频)、自定义格式 纯文本文件
性能 更底层,控制更精细 更高层,使用更方便

最佳实践

  1. 始终使用 using 语句:确保文件句柄被正确释放,避免文件被锁定。
  2. 设置合适的缓冲区大小:默认缓冲区为 4KB,对于大文件操作,可适当增大(如 64KB 或 1MB)以提升性能。
  3. 异步优先:在高并发或大文件场景中,使用 ReadAsync/WriteAsync
  4. 处理异常:文件操作可能因权限、路径不存在等原因失败,应捕获 IOExceptionUnauthorizedAccessException 等异常。
  5. 避免在循环中频繁创建 FileStream:如果需要对同一文件多次读写,复用同一个 FileStream 实例(注意线程安全)。

完整示例:安全地复制文件

using System;
using System.IO;
using System.Threading.Tasks;
public class FileHelper
{
    public static async Task CopyFileAsync(string source, string destination)
    {
        if (!File.Exists(source))
            throw new FileNotFoundException("源文件不存在", source);
        try
        {
            using (var sourceStream = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
            using (var destStream = new FileStream(destination, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
            {
                await sourceStream.CopyToAsync(destStream);
            }
        }
        catch (IOException ex)
        {
            Console.WriteLine($"IO 错误: {ex.Message}");
            throw;
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine($"权限不足: {ex.Message}");
            throw;
        }
    }
}

FileStream 是 .NET 中文件操作的基石,掌握它能让你灵活处理各种文件 I/O 场景。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/485367.html

(0)
RAKsmart美国站群服务器真的只要$189吗?美国站群服务器租用价格
上一篇 2026年7月12日 06:15
域名估价工具哪个好用?域名价值评估方法
下一篇 2026年7月12日 06:18

相关推荐

  • idea连接mysql数据库后如何查看_如何查看RDS for MySQL数据库的连接情况

    IDEA里连接MySQL后,想确认连接是否正常,看左侧Database面板的列表和Console标签页就够了;如果是RDS for MySQL,要看连接情况,直接登录云控制台看监控曲线,再用一条SQL查当前会话明细,两种方法配合能定位绝大多数连接问题,在云数据库普及的今天,连接失败的原因往往不只在IDEA这一侧……

    2026年8月19日
    800
  • Ollama怎么导入本地模型?Ollama添加本地大模型教程

    Ollama导入本地模型的核心逻辑是通过命令行调用ollama pull指令,从官方库下载模型,或直接复制模型文件至指定目录并运行ollama create命令进行注册,在本地部署大语言模型(LLM)已成为开发者和技术爱好者的常态,而Ollama凭借其极简的操作体验,成为了这一领域的热门选择,很多用户在初次接触……

    2026年6月19日
    2410
  • 服务器配置ca证书怎么做,有哪些注意事项?

    服务器配置CA证书的核心在于证书链完整、私钥匹配、路径正确,下面按场景拆解具体操作,服务器配置ca证书的步骤:从下载到生效准备工作:确认证书文件与服务器环境配置前先确认你从CA机构拿到的是哪几类文件,一般情况下,你会收到一个压缩包,里面包含:域名证书(.crt或.pem)中间证书链(ca-bundle或chai……

    2026年7月23日
    600
  • 大模型SFT监督微调怎么操作?SFT微调需要哪些数据

    大模型SFT监督微调的核心在于通过高质量指令数据集,让预训练模型从“通用知识储备”转变为“特定任务专家”,其关键不在于数据量的堆砌,而在于数据的质量清洗与指令结构的精准设计,在2026年的AI应用落地场景中,通用大模型往往难以直接满足垂直行业的专业需求,企业或开发者若希望模型具备特定的行业知识、遵循特定的输出格……

    2026年6月17日
    2100
  • 为什么浮点数运算会有误差?,计算机浮点数精度问题怎么解决?

    深入理解浮点数运算什么是浮点数精度问题?在计算机科学中,浮点数运算(Floating-point arithmetic)并非总是精确的,这是因为大多数计算机系统遵循 IEEE 754 标准,使用二进制来表示浮点数,由于十进制中的某些小数(如 0.1 或 0.2)在二进制中是无限循环小数,而计算机的存储空间(如……

    2026年7月13日
    1100
  • ICP备案记录怎么管理?,具体流程有哪些?

    ICP备案信息管理并非一次性工作,而是需要持续跟踪和维护的周期性任务,核心在于确保备案主体信息、域名、接入商等数据的实时准确,避免因信息不实或过期导致备案被注销,ICP备案信息管理为什么重要很多网站运营者认为ICP备案提交通过后就万事大吉,但行业共识表明,备案信息的动态管理才是避免网站被关停的关键,工信部对备案……

    2026年8月21日
    1000
  • ifix4.5服务器配置怎么设置?,服务器配置有哪些步骤?

    ifix4.5服务器配置不是简单硬件堆砌,而是根据项目规模、I/O点数、历史数据存储和冗余需求综合确定的方案,合理选择操作系统版本和硬件规格才能保证系统长期稳定运行,ifix4.5服务器配置要求有哪些很多用户第一次接触ifix4.5时,最关心的是具体需要什么样的硬件和软件环境,ifix4.5作为GE的经典SCA……

    2026年8月1日
    1000
  • iis7怎么设置域名访问,域名访问设置方法有哪些

    IIS 7设置域名的核心操作是在网站绑定中添加主机头为你的域名,并确保DNS解析指向服务器IP,这样访问域名就能准确到达网站,准备工作与前提条件在开始之前,确保IIS 7已经安装并运行,网站已经创建,域名需要注册,DNS解析记录指向服务器IP,如果要在本地测试,可以临时修改hosts文件,服务器防火墙必须开放H……

    2026年8月4日
    300
  • 服务器和客户端如何实现?

    服务器和客户端实现的核心在于通过标准化的网络协议(如HTTP/HTTPS)建立双向通信,利用RESTful API或WebSocket等技术栈,确保数据在两端的高效、安全传输与状态同步,在现代Web开发和移动应用架构中,理解服务器与客户端的交互逻辑是构建稳定系统的基石,这不仅仅是代码的拼接,更是数据流向的艺术……

    2026年7月10日
    11400
  • 大模型如何实现可持续发展?大模型未来发展趋势

    大模型的可持续发展核心在于平衡算力能效、数据伦理与商业闭环,通过绿色计算架构、合规数据治理及可解释性技术,实现从“高耗能消耗”向“高效能服务”的转型,算力能效优化:降低大模型碳足迹的实操路径随着参数规模突破万亿大关,训练和推理过程中的能耗问题已成为行业痛点,业内专家指出,能源效率已不再是单纯的环保指标,而是决定……

    2026年6月20日
    2500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注