2013-11-21 52 views
5

我有一個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事件,如果我不知道我有conservate的字符串編碼:

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

但我也得到一個OutOfMemoryException的實例變量爲bytes

現在,我跑了OutOfOptions,我不知道該怎麼辦。

+1

如何在獲取字節數組後將數據塊寫入數據庫?是否有流媒體選項? (理想情況下,您不需要將整個文件作爲字符串存儲在內存中) –

+2

或者找出一種方法讓兩個數據庫直接對話。 – samjudson

+0

我開始看ODP.NET,我沒有看到流式選項。它幾乎看起來像你需要自己把它分成塊,並簡單地追加數據庫中的字段。也許寫一個SPROC,將字節追加到當前字段,並循環調用它插入塊,直到您插入整個對象 – Wjdavis5

回答

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); 
     } 
    } 
} 
+0

該字符串來自一個文件,我不覺得有用的將它放在一個文件中。謝謝你! – sabotero

+0

我不知道你在做什麼與你有他們的內容。希望你已經有一些方法將它分塊寫入最終目的地。在這種情況下,你可以打開一些附加到最終目的地的流,而不是'StreamWriter',然後將char緩衝區轉換成一個小字節數組,然後將該字節數組寫入流中。 .NET流大部分是可以互換的,所以代碼會很相似。 –

+0

我試圖在Devart之間寫入一個oracle數據庫中的內容。 – sabotero