我有一个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
,我不知道该怎么做。
答案 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);
}
}
}