流编写器将 BOM 字符 65279 追加到文件末尾

本文关键字:追加 文件 65279 字符 BOM | 更新日期: 2023-09-27 18:33:04

在我从文件中读取文件的同时,我有一个StreamWriter打开了我的文件,这似乎导致了问题(这是一组较大代码的较小片段,只是为了说明我的问题):

static void Main(string[] args)
{
    for (int i = 0; i < 3; i++)
    {
        using (FileStream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8, false, 0x1000, true))
        using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8, 0x1000, true))
        {
            Console.WriteLine("Read '"" + reader.ReadToEnd() + "'" from the file.");
        }
    }
    Console.ReadLine();
}

上面的代码将输出:

Read "" from the file.
Read "" from the file.
Read "?" from the file.

如果文件已经包含一些文本,则编写器会将 BOM 附加到末尾,尽管从未被调用过写入任何内容:

Read "TEXT" from the file.
Read "TEXT?" from the file.
Read "TEXT??" from the file.

为什么会表现出这种行为?

流编写器将 BOM 字符 65279 追加到文件末尾

正如我之前在关于字节顺序标记的评论中所暗示的那样,您正在尝试避免添加带有 StreamWriter 的字节顺序标记。这基于您使用的编码器。

例如,尝试创建自己的编码器,而不写入字节顺序标记:

static void Main(string[] args)
{
    for (int i = 0; i < 3; i++)
    {
        using (FileStream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8, true, 0x1000, true))
        using (StreamWriter writer = new StreamWriter(stream, new UTF8Encoding(false), 0x1000, true))
        {
            Console.WriteLine("Read '"" + reader.ReadToEnd() + "'" from the file.");
        }
    }
    Console.ReadLine();
}

通过使用 new UTF8Encoding(false) 作为 UTF8 编码器,将明确指示编码器不要使用 Unicode 字节顺序标记。这在 UTF8Encoding 构造函数的 MSDN 条目中进行了描述。

嗯。我认为作家想写字节顺序标记,即使你什么都不写。您将流位置移动到流的末尾,因此当您释放编写器时 - 它会将字节顺序标记刷新到流的末尾。

试试这个代码

    static void Main(string[] args)
    {
        for (int i = 0; i < 3; i++)
        {
            using (FileStream stream = new FileStream("sample.txt", FileMode.OpenOrCreate))
            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8, false, 0x1000, true))
            using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8, 0x1000, true))
            {
                writer.Flush();
                Console.WriteLine("Read '"" + reader.ReadToEnd() + "'" from the file.");
            }
        }
        Console.ReadLine();
    }

您将看到预期的行为,没有"?"符号。