【问题标题】:Change the encoding to UTF-8 on a stream (MemoryMappedViewStream)将流上的编码更改为 UTF-8 (MemoryMappedViewStream)
【发布时间】:2011-08-19 17:11:19
【问题描述】:

我正在使用下面的代码尽可能快地读取 ~2.5Gb Xml 文件(感谢 MemoryMappedFile)。但是,我收到以下异常:“'.',十六进制值 0x00,是无效字符。第 9778 行,位置 73249406。”。我相信这是由于一些编码问题。如何确保 MemoryMappedViewStream 使用 UTF-8 读取文件?

static void Main(string[] args)
{
    using (var file = MemoryMappedFile.CreateFromFile(@"d:\temp\temp.xml", FileMode.Open, "MyMemMapFile"))
    {
        using (MemoryMappedViewStream stream = file.CreateViewStream())
        {
            Read(stream);
        }
    }
}

static void Read(Stream stream)
{
    using (XmlReader reader = XmlReader.Create(stream))
    {
        reader.MoveToContent();

        while (reader.Read())
        {
        }
     }
 }

【问题讨论】:

  • 不,这是因为您超出了映射的末尾。您只能希望在 64 位操作系统上映射完整的 2.5 GB。这段代码没有完成任何事情,您实际上是通过复制数据两次来使其变慢。首先到文件系统缓存,再到视图。内存映射文件仅在您重复从中读取相同数据时才有用。你没有。

标签: c# encoding xmlreader memory-mapped-files


【解决方案1】:

您可以使用StreamReader 类来设置编码:

static void Main(string[] args)
{
  using (var file = MemoryMappedFile.CreateFromFile(@"d:\temp\temp.xml", FileMode.Open,  "MyMemMapFile"))
  {
     using (MemoryMappedViewStream stream = file.CreateViewStream())
    {
        Read(stream);
    }
   }
}

static void Read(Stream stream)
{
  using (XmlReader reader = XmlReader.Create(new StreamReader(stream, Encoding.UTF8)))
  {
     reader.MoveToContent();

    while (reader.Read())
    {
    }
 }
}

希望,这会有所帮助。

【讨论】:

    【解决方案2】:

    MSDN 上,您会得到以下信息。

    “XmlReader 扫描流的第一个字节,寻找字节顺序标记或其他编码符号”

    您的 xml 文件是否指定了编码?

    <?xml version="1.0" encoding="UTF-8"?>
    

    【讨论】:

    • 嗯,问题是关于从流中读取,而这个答案完全是关于写入。这不适用于OP的问题。当此处的代码示例是关于在文本到达流之前将文本编码为字节时,“做类似的事情”不会计算。
    • @Henning Makholm,改变了我的答案。抱歉认为这可能是他阅读和转换流的方式。但后来才看到他的例子。
    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 2019-10-25
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多