【问题标题】:Writing string and bytes to the same FileStream将字符串和字节写入同一个 FileStream
【发布时间】:2015-04-07 21:22:07
【问题描述】:

我需要创建一个文件,其中一些部分是字符串(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 并打开另一个 FileStream 才能写入一个字节,因为 BinaryStream.Write(string) 方法会预先添加一个“长度”字段(在我的情况下不需要)或 StreamWriter.Write(byte) 编码字节值而不是实际直接写入。

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

【问题讨论】:

  • 你为什么不把你的字符串转换成字节数组并用二进制写入器来写呢?
  • 为什么不把你的字符串写成字节(或者如果你愿意,也可以把字节写成字符串)?
  • 旁注:我建议重新考虑“不想要以长度为前缀的字符串”的要求 - 如果您提前知道长度,阅读会容易得多。
  • 至于“为什么我没有”将字符串转换为数组:当然是因为我没有意识到这一点!我用binaryWriter.Write(myString.ToCharArray());binaryWriter.Write(Encoding.UTF8.GetBytes(myString)) 解决了这个问题。
  • 您可能想要使用System.Text.Encoding,如下 CodeCaster 建议的那样。

标签: c# filestream streamwriter binarywriter


【解决方案1】:

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,即.NET language for "UTF-16LE",每个字符为您提供两个字节。

【讨论】:

  • FileStream.Write() 不需要额外的参数,比如位置和数组大小?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 2017-04-19
  • 2019-09-05
  • 2014-12-18
  • 1970-01-01
  • 2013-09-27
相关资源
最近更新 更多