gpt4 book ai didi

c# - 非常大的字符串到字节数组

转载 作者:数据小太阳 更新时间:2023-10-29 01:57:18 26 4
gpt4 key购买 nike

我有一个 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);

我在调用 ToCharArray() 时得到了 OutOfMemoryException

所以我猜是处理字符串的问题。

然后我尝试使用我发现的以下方法 here事件如果我不确定我必须保留字符串的编码:

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

但是我在实例化 bytes 变量时也遇到了 OutOfMemoryException

现在,我运行了 OutOfOptions,但我不知道该怎么做。

最佳答案

因为你已经在内存中得到了原始的完整字符串,你可以使用一个 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);
}
}
}

关于c# - 非常大的字符串到字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20124864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com