非常大的字符串到字节数组

时间:2013-11-21 15:22:30

标签: c# xml string

我有一个XML文件,它源于导出数据库(Oracle 11g Unicode)表。 该表有一个表示文件的BLOB字段。该文件可能非常大。

因此,在我有一个非常大的文件的情况下,在XML中获取该文件的一个非常大的字符串表示。

我必须获取此字符串的字节才能将文件插入另一个数据库实例。

在这一点上,XML被收费,然后我有一个代表该文件的字符串。

我所做的是:

Encoding.Unicode.GetBytes(stringFileRepresentation);

但我得到OutOfMemoryException

如果我这样做:

Encoding.Unicode.GetBytes(stringFileRepresentation.ToCharArray());

我还得到OutOfMemoryException

我在解码字符串之前也尝试过这样做:

var chars = stringFileRepresentation.ToCharArray();
Encoding.Unicode.GetBytes(chars);

我在致电OutOfMemoryException时收到ToCharArray()

所以我认为处理字符串时会出现问题。

然后我正在尝试以下方法找到here事件,如果我不确定我必须保留字符串的编码:

byte[] bytes = new byte[str.Length * sizeof(char)];
Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);

但我在实例化OutOfMemoryException变量时也得到bytes

现在,我跑了OutOfOptions,我不知道该怎么做。

1 个答案:

答案 0 :(得分:4)

由于你已经在内存中获得了原始的完整字符串,你可以使用StringReader来缓冲它:

这会将文本放入文件中。您可以使用类似的技术写入不同的流而不是文件。

using (var sr = new StringReader(fileContents))
{
    using (var outputWriter = new StreamWriter(@"C:\temp\output.txt"))
    {
        char[] buffer = new char[10];
        int numChars;
        while ((numChars = sr.ReadBlock(buffer, 0, buffer.Length)) > 0)
        {
            outputWriter.Write(buffer, 0, numChars);
        }
    }
}

修改

写入文件以外的其他内容非常相似 - 例如,假设您想直接写入流(无论哪种流 - 无论是MemoryStream,HttpResponse流,FileStream等):

using (var sr = new StringReader(fileContents))
{
    using (var outputStream = GetSomeStreamFromSomewhere())
    {
        char[] buffer = new char[10];
        int numChars;
        while ((numChars = sr.ReadBlock(buffer, 0, buffer.Length)) > 0)
        {
            char[] temp = new char[numChars];
            Array.Copy(buffer, 0, temp, 0, numChars);
            byte[] byteBuffer = Encoding.UTF8.GetBytes(temp);
            outputStream.Write(byteBuffer, 0, byteBuffer.Length);
        }
    }
}