2012-08-24 46 views
0

我需要以各種方式在Java中保存一些數據,至File,至String,至System.out ......我最終用3種方法做了幾乎相同的事情。所以我將它們改爲一個以OutputStream作爲參數的單一方法。我爲一個OutputStream寫了一些東西,例如一些文本,一個序列化的對象,另一個序列化的對象,一些數字數據...如何在同一個InputStream中讀取不同的數據組,對每個InputStream使用不同類型的InputStream?

但現在我卡住了。我忽略了我無法區分已寫入的不同事物的事實。我爲數據創建了一個InputStream。我在該流上使用Scanner首先讀取文本,然後嘗試使用ObjectInputStream讀取序列化對象,但是我得到一個EOFException

我想掃描儀預讀。如何防止掃描儀預讀。
或者說,我怎樣才能使用適當的InputStream爲每個數據讀取每組數據。

+1

因此,您有一個InputStream,您想使用Scanner *和* ObjectInputStream進行讀取? – aioobe

+0

是的,如果可能的話 – neXus

+1

您必須決定它是否是文本例如掃描儀或二進制例如ObjectInputStream的。如果你真的知道自己在做什麼,你可以混合它們,但這不太可能是一個好主意。即它更可能是一個可怕的混亂。 –

回答

2

你真的不想嘗試使用不同的閱讀器從同一個流中讀取。即使你設法使它在你的機器上工作,當你在不同的操作系統或不同的JVM實現上運行時,它可能會中斷。

您應該選擇一種讀取和寫入數據的方法。既然你在流中使用序列化對象,你可能最好使用它來處理所有事情。您已經在您的評論中指出,通過字符串讀取二進制數據並正確解釋它非常困難。但是,獲取一個String對象並不難,把它寫在輸出流上,讀回來並將其轉換爲一個String。

現在有解釋您的數據的問題。我建議將所有內容寫入標籤數據對中。你首先寫出一個Integer(也許是一個枚舉的序號,使它們更容易在你的程序中使用),然後你寫出你的數據。整數表示流中下一個數據的類型(例如Text或Object),然後讀入的下一個對象是數據,您知道它是什麼類型。如果是文本,則可以將對象轉換爲字符串,並將其傳遞給掃描器,如果它是對象,則只需執行任何與該對象相關的操作。

爲了使事情變得更清潔,您可以使用每種數據類型的方法在流的周圍構建一個包裝。也許你可以有一個getNextObject()方法和一個getNextTextScanner()方法。每個人都會首先檢查流中的下一個Integer標記,以確保它正在讀取正確的數據(如果發現不匹配則拋出異常),然後返回下一個Object或返回一個新的Scanner來處理一串數據。

真的,如果您可以爲兩種不同類型的數據使用不同的流,那會更好。但是,如果你真的被困在同一個流中,那我就是這麼做的。

+0

這是一個很好,清晰的答案。我試圖實現這些自定義流。問題在於,據我所知,序列化只能通過ObjectOutputStream和ObjectInputStream完成。這些類的實現似乎在很大程度上依賴於JVM。他們不是純粹的Java代碼。我顯然不能創造自己的行爲,而不發明自己的序列化機制,我不想這樣做。看來我需要在引擎蓋下使用這些流。我會盡力明天開始工作。 – neXus