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://test.idctop.com/article/485367.html

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

相关推荐

  • form表单验证怎么实现?form表单验证必填项

    前端表单验证是确保用户输入数据合法性和完整性的关键步骤,以下是一个使用 HTML、CSS 和 JavaScript 实现简单表单验证的示例:HTML 结构<!DOCTYPE html><html lang="zh-CN"><head> <meta c……

    2026年7月12日
    9500
  • 分布式搜索是什么?分布式搜索与集中式搜索的区别

    分布式搜索(Distributed Search) 是一种架构模式,旨在通过多台服务器协同工作来解决海量数据的存储、索引和查询问题,它突破了单机搜索在数据量、查询并发量和响应速度上的瓶颈,以下是关于分布式搜索的核心概念、架构原理、主流技术栈及最佳实践的详细介绍:为什么需要分布式搜索?随着互联网数据量的爆炸式增长……

    2026年7月10日
    5600
  • IDC业务到底是什么?,如何选择靠谱的IDC服务商?

    IDC业务即互联网数据中心服务,为企业提供服务器托管、租用及运维管理,是支撑数字经济的核心基础设施,修改IDC描述是日常资源管理中的常见操作,直接关联到资产识别和运维效率,什么是IDC业务定义与核心服务IDC业务的全称是互联网数据中心业务,指利用标准化的机房环境、网络带宽和电力资源,为客户提供服务器托管、主机租……

    2026年8月4日
    1300
  • ipv6网络_ELB支持IPv6网络吗?

    目前主流云厂商的弹性负载均衡(ELB)产品均已支持IPv6网络,但在双栈模式、纯IPv6场景下的配置细节、性能表现和价格策略上存在差异,需要根据实际业务场景和云服务商选择,ELB支持IPv6网络吗?先看主流厂商状态行业共识认为,IPv6已经是网络基础设施的必然趋势,国内头部云厂商的ELB产品,在公网和私网场景下……

    2026年8月11日
    900
  • 服务器如何主动推送消息给客户端?websocket实时通信原理

    服务器主动往客户端发送消息的核心在于建立长连接通道,通过WebSocket或Server-Sent Events(SSE)技术打破传统HTTP请求-响应的单向限制,实现服务端数据的实时推送,在传统的Web开发模式中,客户端(浏览器或App)就像是一个总是处于等待状态的服务员,只有当它主动向服务器发起请求时,服务……

    2026年7月10日
    13600
  • Koboldcpp怎么加载GGUF模型,如何正确导入gguf文件

    Koboldcpp加载GGUF模型的核心方法是使用命令行参数指定模型路径,通常通过–model参数指向本地.gguf文件,并配合–ctx-size设置上下文窗口,即可在本地终端或GUI界面中快速启动推理服务,在本地部署大语言模型(LLM)成为开发者和技术爱好者的常态后,如何高效、稳定地运行这些模型成为了首要……

    2026年6月18日
    2000
  • 大模型推理TTFT为何高?大模型推理首字延迟优化

    首字延迟(TTFT)是指从用户发出请求到大模型输出第一个字符所需的时间,它是衡量大模型响应速度的核心指标,直接决定了用户的交互体验是否流畅,在2026年的今天,大模型已经深入到了医疗诊断、代码生成、实时客服等高频交互场景中,用户不再满足于“能回答”,而是追求“秒级响应”,TTFT作为这一体验的起点,其重要性不言……

    2026年6月22日
    4900
  • intel云_Intel MPI

    百度智能云上的Intel MPI是一套成熟的高性能计算消息传递库,凭借与至强处理器和RDMA网络的深度优化,成为并行计算和大规模科学仿真的首选方案,并且百度云控制台直接提供免费的一键部署能力,用户只需按计算资源付费,Intel MPI在百度智能云上的定位与优势云计算厂商构建HPC集群时,消息传递接口是打通多节点……

    2026年8月19日
    300
  • AI大模型如何优化简历?大模型写简历靠谱吗

    AI大模型简历指导的核心在于将通用模板转化为针对特定岗位的“人机对话”策略,通过精准匹配JD关键词并利用AI进行STAR法则重构,可显著提升简历通过率,在2026年的求职市场中,传统的“海投”模式已彻底失效,HR每天筛选数百份简历,而AI筛选系统更是将这一过程压缩至秒级,求职者面临的不再是“如何写好简历”,而是……

    2026年6月15日
    2800
  • 服务器IP与客户端IP有什么区别,怎么查询本机公网IP地址?

    服务器 IP 地址与客户端 IP 地址详解在网络通信中,IP 地址(Internet Protocol Address) 是设备在网络上的唯一标识符,类似于现实世界中的邮寄地址,根据设备在通信中所扮演的角色,IP 地址被分为服务器 IP 和 客户端 IP,服务器 IP 地址 (Server IP Address……

    2026年7月13日
    3800

发表回复

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