我有一个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,我不知道该怎么办.
由于您已经在内存中获得了原始的完整字符串,您可以使用 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)