流编写器将 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.
为什么会表现出这种行为?
正如我之前在关于字节顺序标记的评论中所暗示的那样,您正在尝试避免添加带有 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();
}
您将看到预期的行为,没有"?"符号。