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. 处理异常:文件操作可能因权限、路径不存在等原因失败,应捕获 IOException、UnauthorizedAccessException 等异常。
  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://test.idctop.com/article/485367.html

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

相关推荐

  • IDEA中Maven配置在哪里?,怎么配置

    在IntelliJ IDEA中配置Maven的核心是正确设置Maven home directory、User settings file和Local repository,通过File → Settings → Build, Execution, Deployment → Build Tools → Mave……

    2026年8月20日
    700
  • 如何实现服务器端刷新客户端?服务器主动推送数据给前端

    服务器端刷新客户端的核心在于通过WebSocket或Server-Sent Events(SSE)建立持久连接,由服务端主动推送数据变更指令,从而避免客户端频繁轮询带来的高延迟与资源浪费,在传统的前后端交互模式中,客户端像是一个不断询问“有新消息吗?”的焦急访客,而服务器则像是一个忙碌的管家,每次都要停下来查看……

    2026年7月8日
    20000
  • IIS能部署Java吗,怎么安装IIS?

    IIS确实可以部署 Java 应用,但必须借助 Tomcat、Jetty 等 Servlet 容器作为后端,利用反向代理或 ISAPI 扩展实现请求转发;安装 IIS 是环境搭建的第一步,之后还需要配置 Java 运行环境和连接器, 很多朋友在 Windows 服务器上既想跑 .NET 又想跑 Java,就会想……

    2026年8月17日
    200
  • indexOf方法测试方法是什么?,怎么用?

    indexOf方法怎么用?前端开发必会的数组字符串查找技巧indexOf方法是JavaScript中查找数组元素和字符串子串位置的核心工具,返回首次出现的索引下标,找不到时统一返回-1,这是判断元素是否存在的黄金标准,很多初学者容易把数组的indexOf和字符串的indexOf搞混,两者虽然同名,但使用场景和细……

    2026年8月20日
    500
  • 发优惠信息短信的便宜系统有哪些?,哪个好

    当前市场上,发优惠信息短信的便宜系统依赖三网合一106通道,价格多在0.03-0.05元/条区间,但真正的便宜要看综合到达率和管理成本,单纯比单价容易踩坑,发优惠信息短信哪个平台便宜?核心指标对比选择发优惠信息短信的便宜系统,不能只比单价,你看到0.03元/条的价格,可能隐藏着低到达率、高最低消费、或者通道洗号……

    2026年7月27日
    500
  • idc的优势和dlv的优势分别是什么,怎么选?

    对于企业数字化转型,IDC数据中心提供不可替代的物理基础设施,而DLV虚拟化技术通过动态资源调度提升效率,两者结合是构建高可用、低成本IT架构的最佳选择,IDC机房优势对比:传统数据中心为何仍是基石IDC机房凭借物理安全、电力保障和网络带宽,成为金融、政务等领域的首选,相比公有云,IDC的物理专属性和合规性更受……

    AI资讯 2026年8月4日
    500
  • 服务器云管家验证码登录失败怎么办,云管家验证码收不到怎么解决

    云服务器验证码是保障云资源安全的核心防线,建议开启多因素认证并绑定独立手机或邮箱,以彻底杜绝账号被盗风险,为什么你的云管家总是弹出验证码?很多用户在登录服务器控制台时,都会遇到“验证码错误”或“频繁请求”的提示,这并非系统故障,而是云服务商在识别异常行为,云管家作为管理云资源的入口,其安全性直接关联到你的数据资……

    2026年7月7日
    2400
  • IaaS和DevOps如何结合?,有哪些最佳实践?

    IaaS DevOps就是把基础设施当代码管,让云资源像流水线一样自动交付,核心结论是:谁先掌握这个能力,谁就能在2026年把环境部署时间从周级压缩到分钟级,先看清IaaS DevOps到底是什么要想搞明白IaaS DevOps,不能只看字面意思,拆开说,IaaS是云计算的底层服务,提供虚拟机、存储、网络这些基……

    2026年8月20日
    700
  • 生产工厂如何利用AI大模型?制造业AI大模型应用场景

    生产工厂引入AI大模型并非简单的软件升级,而是通过重构数据流与决策链,实现从“经验驱动”向“数据智能驱动”的根本性转型,从而显著降低运维成本并提升良品率,传统制造业正站在转型的十字路口,过去,工厂依赖老师傅的经验判断设备状态,依赖人工肉眼检测产品瑕疵,这种模式在规模化生产面前显得脆弱且低效,随着算力成本的下降和……

    2026年6月13日
    3510
  • 福建省网络信息安全测评中心是什么?测评机构排名及收费标准

    福建省网络信息安全测评中心是福建省内具备国家级资质的第三方权威机构,主要为企业提供等保测评、密评、风险评估及代码审计等服务,是保障关键信息基础设施合规运行的核心力量,为什么企业必须选择省级权威测评机构?在数字化浪潮下,网络安全已不再是“选修课”,而是关乎企业生死存亡的“必修课”,许多企业在面对监管要求时,往往陷……

    2026年7月3日
    9400

发表回复

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