C# StreamWriter 指定自定义缓冲区大小写入文件

C# StreamWriter 指定自定义缓冲区大小写入文件

一、带缓冲区参数的构造函数

StreamWriter 有4参数重载,可以手动设置内部字符缓冲区字节大小:

public StreamWriter(string path, bool append, Encoding encoding, int bufferSize);

参数说明:

  1. path:文件路径
  2. append:true=追加,false=覆盖
  3. encoding:文本编码
  4. bufferSize:缓冲区字节大小,最小值建议 128,官方推荐 4096 / 8192 / 16384

默认缓冲区大小:4096 字节

二、基础示例(自定义缓冲区)

using System;
using System.IO;
using System.Text;

class Demo
{
    static void Main()
    {
        string filePath = "bufferTest.txt";
        Encoding utf8NoBom = new UTF8Encoding(false);
        int customBuffer = 8192; // 8KB缓冲区

        // 指定缓冲区8192字节
        using (StreamWriter sw = new StreamWriter(filePath, false, utf8NoBom, customBuffer))
        {
            sw.WriteLine("自定义缓冲区写入文本");
            sw.WriteLine("大数据循环写入场景提升IO性能");
        }
    }
}

三、追加写入 + 自定义缓冲区

string logPath = "log.txt";
int buffer = 16384; // 16KB大缓冲区
Encoding enc = Encoding.UTF8;

using (StreamWriter sw = new StreamWriter(logPath, true, enc, buffer))
{
    sw.WriteLine($"{DateTime.Now} 日志追加");
}

四、配合 FileStream 指定缓冲区(底层流写法)

先创建 FileStream,再传入 StreamWriter,缓冲区仍由 StreamWriter 第四个参数控制:

string path = "streamBuffer.txt";
Encoding enc = new UTF8Encoding(false);
int bufSize = 4096 * 2; // 8192

using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
using (StreamWriter sw = new StreamWriter(fs, enc, bufSize))
{
    sw.WriteLine("通过FileStream构造并自定义缓冲区");
}

五、循环大批量写入(大缓冲区优势场景)

写入上万行、导出大量数据时,调大缓冲区能减少磁盘IO次数,速度明显提升:

string path = "batchBigBuffer.txt";
int bigBuffer = 16384; // 16KB
Encoding utf8 = new UTF8Encoding(false);

using (StreamWriter sw = new StreamWriter(path, false, utf8, bigBuffer))
{
    for (int i = 0; i < 100000; i++)
    {
        sw.WriteLine($"数据行{i}");
    }
    sw.Flush(); // 循环结束强制落盘
}

六、异步写入+自定义缓冲区

using System.Threading.Tasks;

static async Task WriteAsyncWithBuffer()
{
    string path = "asyncBuffer.txt";
    int buf = 8192;
    Encoding enc = Encoding.UTF8;

    using (StreamWriter sw = new StreamWriter(path, false, enc, buf))
    {
        await sw.WriteLineAsync("异步+自定义缓冲区");
        await sw.FlushAsync();
    }
}

七、关键知识点与注意事项

  1. bufferSize 单位是字节
    不是字符数,UTF8一个汉字占3字节,缓冲区存满后自动刷盘到磁盘。

  2. 缓冲区怎么选

    • 少量日志、单行写入:默认 4096 足够,无需修改
    • 批量导出、循环万行数据:8192 / 16384 提升性能
    • 超大文件持续写入:32768(32KB),不建议超过 65536
  3. 缓冲区与 Flush()
    数据先存在内存缓冲区,缓冲区填满才自动写入磁盘;
    调用 sw.Flush() 会无视缓冲区剩余空间,强制把现有内容写入文件。

  4. 混用 BaseStream 写字节时缓冲错乱问题
    如果同时用 sw.WriteLine()sw.BaseStream.Write(byte[]),操作字节前必须 sw.Flush(),清空字符缓冲区,避免文字与字节顺序错乱。

  5. 不能只传缓冲区、省略编码
    缓冲区参数是第四个,前面必须传编码,不存在只传路径+追加+缓冲区的重载。

最简通用模板

// 覆盖写入,UTF8无BOM,8KB缓冲区
var enc = new UTF8Encoding(false);
int buffer = 8192;
using var sw = new StreamWriter("test.txt", false, enc, buffer);
sw.WriteLine("测试内容");
posted @ 2026-06-19 20:52  人生就是修炼  阅读(7)  评论(0)    收藏  举报