当前位置: 首页 > news >正文

C# StreamWriter 写入字节数组两种方案

C# StreamWriter 写入字节数组两种方案

先分清核心概念:
StreamWriter字符写入器,只负责字符串/字符;它本身没有直接写入 byte[] 的方法
字节数组属于二进制数据,有两种实现思路:

  1. 先把 byte[] 转字符串,再用 StreamWriter 写入(字节当文本)
  2. 拿到底层 FileStream,直接 Write 字节数组(推荐,原生写二进制)

一、方式1:byte[] → 字符串 → StreamWriter写入(字节作为文本保存)

适用场景:字节是文本编码后的内容,需要以文本形式存到txt。
原理:用对应编码把 byte[] 解码成 string,再 Write/WriteLine。

using System;
using System.IO;
using System.Text;class Program
{static void Main(){// 原始字节数组(UTF8编码的中文)byte[] buffer = Encoding.UTF8.GetBytes("测试字节数组文本");string path = "byteToStr.txt";Encoding utf8NoBom = new UTF8Encoding(false);using (StreamWriter sw = new StreamWriter(path, false, utf8NoBom)){// 字节数组解码为字符串string text = utf8NoBom.GetString(buffer);sw.WriteLine(text);}}
}

二、方式2:获取底层流,直接写入byte[](真正写二进制字节,推荐)

StreamWriter.BaseStream 获取内部的 FileStream,FileStream 原生支持 Write(byte[], offset, count),可以直接写入字节数组,不走字符转换。

using System;
using System.IO;
using System.Text;static void WriteBytesByStreamWriter()
{string path = "writeBytes.txt";byte[] data = { 0x31, 0x32, 0x33, 0xE4, 0xB8, 0xAD }; // "123中" 的UTF8字节using (StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8)){// 获取底层文件流Stream fs = sw.BaseStream;// 写入字节数组:数组、起始偏移、写入长度fs.Write(data, 0, data.Length);// 强制刷新缓冲区,确保数据落盘fs.Flush();}
}

追加模式写入字节

byte[] appendData = Encoding.UTF8.GetBytes("\r\n追加的字节内容");
using (StreamWriter sw = new StreamWriter("writeBytes.txt", true, Encoding.UTF8))
{sw.BaseStream.Write(appendData, 0, appendData.Length);sw.BaseStream.Flush();
}

三、异步写入字节数组(BaseStream异步)

static async Task WriteBytesAsync()
{string path = "asyncBytes.txt";byte[] bytes = Encoding.UTF8.GetBytes("异步写入字节");using (StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8)){await sw.BaseStream.WriteAsync(bytes, 0, bytes.Length);await sw.BaseStream.FlushAsync();}
}

四、重要注意事项

  1. StreamWriter 缓冲冲突
    StreamWriter 自带字符缓冲区,如果你混用 sw.WriteLine()BaseStream.Write(),字符缓冲会优先写入,字节会出现在文字前面/错乱。
    混用前必须先调用 sw.Flush() 清空字符缓冲区:

    using (StreamWriter sw = new StreamWriter("test.txt", false))
    {sw.WriteLine("文字内容");sw.Flush(); // 先把文字刷进流byte[] b = {0x30};sw.BaseStream.Write(b,0,b.Length);
    }
    
  2. 不要混淆两种用途

    • 想把字节当成可读文本:用 Encoding.GetString(byte[]) 转字符串再Write
    • 想原样保存二进制字节(文件、加密数据等):直接操作 BaseStream
  3. 编码统一
    通过 BaseStream 写字节时,字节本身是什么编码,文件就是什么编码,不受 StreamWriter 构造函数编码参数影响;
    只有调用 sw.Write(string) 时,才会使用构造传入的编码转字节。

最简封装方法

/// <summary>通过StreamWriter底层流写入字节数组</summary>
static void WriteBytes(StreamWriter sw, byte[] buffer)
{if (buffer == null || buffer.Length == 0) return;sw.BaseStream.Write(buffer, 0, buffer.Length);sw.BaseStream.Flush();
}

调用示例:

byte[] buf = Encoding.UTF8.GetBytes("封装测试");
using var sw = new StreamWriter("demo.txt", false, new UTF8Encoding(false));
WriteBytes(sw, buf);
http://www.jsqmd.com/news/1044429/

相关文章:

  • JavaSecLab:构建企业级Java漏洞实战靶场与SDL培训平台
  • MC68F375 CTM9 PWM模块详解:双缓冲机制、寄存器配置与电机控制实战
  • 2026 唐山防水补漏靠谱服务商盘点:屋面 / 厨卫 / 外墙 / 地下室渗水维修详解,适配冀东滨海大风冻融防水甄选指南 - 宅安选房屋修缮
  • 深耕金陵防水领域 匠心守护安居|微顺虹防水:初心筑品质,服务护万家 - 徽顺虹
  • 深耕山城防水领域 匠心守护安居|微顺虹防水:初心筑品质,服务护万家 - 徽顺虹
  • 2026年离心泵厂家推荐 - 多才菠萝
  • 浙江省舟山市5家反馈不错的戒网瘾军事化管理学校精选2026汇总 - 辛云教育资讯
  • 为什么水平B2B技术厂商学不会懂行?
  • 2026 济宁防水补漏靠谱服务商盘点:屋面 / 厨卫 / 外墙 / 地下室渗水维修详解,适配鲁南滨湖多雨防水甄选指南 - 宅安选房屋修缮
  • 2026年不锈钢离心泵厂家推荐指南 - 多才菠萝
  • TI C2000 eCAP 笔记
  • S12 CPMU模块解析:时钟、复位与电源管理在嵌入式系统的核心作用
  • 普宁配镜哪家靠谱|本地眼镜店靠谱与不靠谱的核心区别 - 品牌观察
  • 锂电池电瓶车跨省怎么寄?带电池托运合规方法+省钱攻略 - 快递物流资讯
  • 2026年工业流体测控与阀门技术演进白皮书:基于严苛工况的实证研判 - 热点观察
  • CPPM报考条件2026最新版——学历和工作经验要求 - 众智商学院课程中心
  • RK3588 NPU架构探秘:从闭源SDK到自定义算子实现的逆向之路
  • 测量系统分析MSA是什么?主要解决什么问题?
  • SSRF漏洞攻防实战:从原理到多层次防御体系构建
  • 端午正常访校|27届成都首创锦榜单招端午3天全天接待,假期可预约看校 - 成都单招培训
  • 2026年选GEO优化公司,这3家专业度更胜一筹 - 速递信息
  • 深耕姑苏防水领域 匠心守护安居|微顺虹防水:初心筑品质,服务护万家 - 徽顺虹
  • PHP国产化数据库(达梦、人大金仓、OceanBase)对接与调优体系.
  • 2026年工业流体测控管网选型指南与主流品牌技术穿透盘点 - 热点观察
  • 2026 赣州防水补漏靠谱服务商盘点:屋面 / 厨卫 / 外墙 / 地下室渗水维修详解,适配赣南多雨山区高湿防水甄选指南 - 宅安选房屋修缮
  • PHP反序列化字符串逃逸漏洞:原理、利用与实战审计
  • 深入解析MC9RS08KA2:低成本8位MCU架构、内存管理与低功耗设计实战
  • 紧急收藏!2026台州戒网瘾学校TOP5揭晓,纽特心理,军事化管理帮孩子戒网逆袭 - 辛云教育资讯
  • Fluent二维刚体平移运动UDF:基于质心运动宏的动网格控制源码包
  • 免费小巧的 FlicKey:macOS 自动切换输入语言工具,告别重输句子!