C#如何读取包含普通和XML文本元素的单个文件

我正在从Web服务接收数据流,并尝试将流的内容保存到文件中.该流包含标准文本行以及大量xml数据块(一行).文件大小约为800Mb.

问题:处理每行的xml部分时,收到内存不足异常.

==start file
line 1
line 2
<?xml version=.....huge line etc</xml>
line 3
line4
<?xml version=.....huge line etc</xml>
==end file

您可以看到当前代码,当它在巨大的xml行中读取时,它会增加内存.

string readLine;
using (StreamReader reader = new StreamReader(downloadStream))
{
    while ((readLine = reader.ReadLine()) != null)
    {
        streamWriter.WriteLien(readLine); //writes to file
    }
}

我试图考虑一个解决方案,其中我同时使用了TextReader / StreamReader和XmlTextReader来处理每个部分.当我到达xml部分时,我可以切换到XmlTextReader并使用Read()方法读取每个节点,从而停止内存高峰.

关于如何执行此操作的任何建议?或者,我可以创建一个自定义的XmlTextReader,它能够在这些行中读取?有任何指示吗?

更新

另一个问题是,我需要重新读回该文件,并将两个xml部分拆分为单独的xml文件!我将解决方案转换为使用二进制编写器写入文件,然后开始使用二进制读取器读回文件.我进行了文本处理以检测xml节的开始,特别是哪个xml节的开始,因此我可以将其映射到正确的文件!但是,这导致读取二进制文件和进行检测时出现问题.

using (BinaryReader reader = new BinaryReader(savedFileStream))
{
    while ((streamLine = reader.ReadString()) != null)
    {
        if (streamLine.StartsWith("<?xml version=\"1.0\" ?><tag1"))
        //xml file 1
        else if (streamLine.StartsWith("<?xml version=\"1.0\" ?><tag2"))
        //xml file 2

解决方法:

如果您要做的就是在不修改数据的情况下将一个流复制到另一个流,则不需要流文本或二进制帮助程序(StreamReader,StreamWriter,BinaryReader,BinaryWriter等),只需复制流即可.

internal static class StreamExtensions
{
    public static void CopyTo(this Stream readStream, Stream writeStream)
    {
        byte[] buffer = new byte[4096];
        int read;
        while ((read = readStream.Read(buffer, 0, buffer.Length)) > 0)
            writeStream.Write(buffer, 0, read);
    }
}
上一篇:下载图片


下一篇:C#读操作(字节/字符)Filestream