2016-11-26 78 views
0

我正在嘗試將我的ArrayList(名爲Clients)寫入文件。它可以工作,但不幸的是它只是將符號寫入文件而不是我的實際輸入。爲什麼ObjectOutputStream將符號寫入文件而不是我的輸入?

下面是我的代碼:

public void SaveToFile() { 

    try 
    { 
     FileOutputStream fos = new FileOutputStream("CustomerLists.txt"); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(Clients); 
     oos.close(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

我如何工作的呢?

+4

你明白'writeObject'的作用嗎? – Makoto

+1

它以二進制格式打印。這並不意味着人類可讀。 – 4castle

+1

或者更重要的是,您是否瞭解['ObjectOutputStream'](https://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html)的作用?它創建一個**二進制**串行化Java對象和值的流。它需要文本,創建一個['FileWriter'](https://docs.oracle.com/javase/8/docs/api/java/io/FileWriter.html)而不是'FileOutputStream',並且可選地包裝在['PrintWriter'](https://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html)和/或['BufferedWriter'](https:// docs。 oracle.com/javase/8/docs/api/java/io/BufferedWriter.html)。 – Andreas

回答

2

你所做的是序列化一個Java對象與文件ObjectOutputStream。這意味着,Java將您的對象Clients轉換爲一個特定的表示形式,其中涵蓋了您的對象具有的所有狀態,例如,成員變量。這種表示方式並不是人類可讀的,它是一種二進制格式,它比文本格式更高效,適用於類和Java環境。查看here瞭解更多信息。

你可以做的反而是使用FileWriter,​​或PrintWriter,其中有多個write[...](...)方法寫入文本文件。在這種情況下,你必須自己編寫每個變量String等,而不是全班。 Here你可以找到一個例子。

對於整個對象,但以完全可定製的方式和人類可讀的形式執行與ObjectOutputStream相同的操作的另一種選擇是使用Java Architecture for XML Binding (JAXB),但這需要一點閱讀。還有用於JSON和其他格式的其他對象序列化庫。

1

爲什麼當我運行這個Java程序時,它會創建文本文件,但它會打印出符號而不是我的輸入?

因爲它不是文本文件。它是根據Java序列化協議編寫的序列化數據,因爲您使用的是ObjectOutputStream.writeObject()

這也意味着CustomerLists.txt不是此文件的合適名稱。

如果需要文本,請使用PrintWriterBufferedWriter

相關問題