Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在流(MemoryMappedViewStream)上将编码更改为UTF-8_C#_Encoding_Xmlreader_Memory Mapped Files - Fatal编程技术网

C# 在流(MemoryMappedViewStream)上将编码更改为UTF-8

C# 在流(MemoryMappedViewStream)上将编码更改为UTF-8,c#,encoding,xmlreader,memory-mapped-files,C#,Encoding,Xmlreader,Memory Mapped Files,我正在使用下面的代码尽可能快地读取~2.5Gb Xml文件(感谢MemoryMappedFile)。但是,我得到了以下异常:“.”,十六进制值0x00,是无效字符。第9778行,位置73249406。”。我相信这是由于一些编码问题。如何确保MemoryMappedViewStream使用UTF-8读取文件 static void Main(string[] args) { using (var file = MemoryMappedFile.CreateFromFile(@"d:\tem

我正在使用下面的代码尽可能快地读取~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())
        {
        }
     }
 }
你可以得到以下信息

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

xml文件是否指定了编码

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

您可以使用
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())
    {
    }
 }
}

希望,这会有所帮助。

嗯,问题是关于从流中阅读,而这个答案是关于写作的。这不适用于OP的问题。当这里的代码示例是关于在文本到达流之前将其编码为字节时,“做类似的事情”不会计算。@Henning Makholm更改了我的答案。抱歉,我想这可能是他阅读和转换流的方式。但后来才看到他的例子。不,这是因为你跑掉了映射的末尾。您只能希望在64位操作系统上映射完整的2.5 GB。这段代码没有完成任何事情,实际上是通过复制两次数据来降低速度。首先是文件系统缓存,然后是视图。只有在重复从内存映射文件中读取相同数据时,内存映射文件才有用。你没有。