2013-04-02 37 views
2

我面臨的情況是,我必須將300 MB的數據寫入XML。使用流我沒有面臨OutOfMemory異常,完美地執行了任務。如何從FileOutputStream對象檢索字符串值?

現在我必須將FileOutputStream對象轉換爲實際數據並將其作爲String傳遞給其他方法。

我試過了,我沒有得到預期的結果。請讓我知道如何將FileOutputStream對象轉換爲字符串值

+0

因此,您需要使用剛寫入的數據將數據傳遞給另一個對象,或者是其他地方的數據? – Skepi

+0

我必須讀取此FileOutputStream對象並將該字符串值傳遞給其他進程的另一個方法。 –

+0

所以你想要:從文件中讀取行,並將此行傳遞給另一個方法參數,true? – Sajmon

回答

3

如果您字符串太大,你試圖在同一時間,以保持它在內存中,它會總是因爲你的OutOfMemoryError獨立於您使用的讀者的事實。

所以,問題不在於你的讀者。問題是你的String對象(你想傳遞的對象)。

如果你需要將一個巨大的文件存儲/傳遞給String變量,那麼你的架構肯定有問題。

你的錯誤是你正試圖把你的XML文本放入Java String變量中。你應該避免在內存中存儲大對象,這是關鍵點。

通常文本是一個壓縮的對象,壓縮比爲0.1 - 0.01。

嘗試使用ZipOutputStream/ZipInputStream(或一些類似的庫) - 它們在讀取/寫入文件的流中正常工作。

在我的實踐中,它可以很好地處理大型XML文件。

+0

感謝您的回覆。正如你所提到的,我們需要改變架構。沒有其他選擇。 +1清楚地解釋它。 –

0

你是如何在文件中寫的? FileOutputStream的創建是可以的,但是當你使用FileOutputStream編寫時,你必須傳遞一些東西給它。當您將數據傳遞給FileOutputStream.write(some_data)時,爲什麼不同時在StringBuffer中寫同樣的數據?

+0

StringBuffer內部使用append方法。在編寫大量數據時,它會給你OutOfMemory異常。 –

+0

您是否試圖一次追加整個數據?你如何在outputStream中寫入,全部以一個字節或一個字節爲單位?如果你正在逐字節寫入,在同一個循環中,如果你對StringBuffer進行了追加,它是否會拋出異常?你也可以檢查:[鏈接](http://stackoverflow.com/questions/2431040/java-outofmemoryerror-with-stringbuilder) –

0

您無法從FileOutputStream讀取。嘗試使用FileReader來讀取文件中的數據。

你不能使用你最初用來創建文件的數據嗎?如果沒有,你可以使用XML解析器像SAXJDOM讀取數據

+0

現在我有FileOutputStream對象,我必須將其轉換爲字符串。我們如何做到這一點? –

+0

我很困惑你想做什麼。你寫了一個文件嗎?你期望通過將FileOutputStream對象轉換爲字符串?你爲什麼需要這樣做? – Skepi

+0

實際上,我正在做這個邏輯的方法應該返回一個字符串值,這將在其他一些方法中使用。我試過fileOutputStream.toString(),它正在返回對象。但是我需要返回一個字符串值。 –