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

sab*_*ero 5 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);
Run Code Online (Sandbox Code Playgroud)

而且我正在接听OutOfMemoryException电话ToCharArray().

所以我觉得在处理字符串时会出现问题.

然后我正在尝试我在这里发现的以下方法事件,如果我不确定我必须保护字符串的编码:

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

但我也在OutOfMemoryException实例化bytes变量.

现在,我跑了OutOfOptions,我不知道该怎么办.

Joe*_*nos 5

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

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

写入文件以外的内容非常相似 - 例如,假设您想直接写入流(无论哪种流 - 可以是 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)