将字符串和字节写入同一个 FileStream

Writing string and bytes to the same FileStream

我需要创建一个文件,其中一些部分是字符串 (utf-8),而一些部分是字节。

我用 StreamWriterBinaryWriter 修改了几个小时,但这是唯一有效的方法:

        using (var stream = new FileStream(_caminho, FileMode.Create, FileAccess.Write))
        {
            using (var writer = new StreamWriter(stream))
            {
                writer.Write(myString);
            }   
        }
        using (var stream = new FileStream(_caminho, FileMode.Append, FileAccess.Write))
        {
            using (var writer = new BinaryWriter(stream))
            {
                writer.Write(oneSingleByte);
            }
        }

问题是我必须关闭 FileStream 并打开另一个文件流才能写入一个字节,因为 BinaryStream.Write(string) 方法会在前面添加一个 "length" 字段(在我的情况下不需要)或StreamWriter.Write(byte) 编码字节值而不是直接写入。

我的问题是:是否有另一个 class 我可以使用,这样我就可以只创建一次 FileStream,然后一个接一个地写入我的字符串和字节?

BinaryWriter 为写入的数据添加前缀,以便 BinaryReader 可以读取它。如果没有这些前缀,您必须确切地知道在写入和读取文件时您在做什么。

如果需要,您可以省略两个写入器并直接写入文件:

using (var stream = new FileStream(_caminho, FileMode.Append, FileAccess.Write))
{
    stream.WriteByte('0'); 
    WriteString(stream, "foo", Encoding.UTF8);
}

private void WriteString(Stream stream, string stringToWrite, Encoding encoding)
{
    var charBuffer = encoding.GetBytes(stringToWrite);
    stream.Write(charBuffer, 0, charBuffer.Length);
}

您需要明确指定编码以获取字节,如 String.ToByteArray returns the string as Unicode characters, which is .NET language for "UTF-16LE",每个字符两个字节。