2016-01-02 17 views
0

我有以下的ArrayList保存數組中的二進制格式

import java.io.*; 
import java.util.*; 
import java.util.logging.*; 

public class SaveData{ 
int counter =1; 
public void saveTheData(ArrayList<myClass> myClassObj){ 
    try{ 
     FileOutputStream fout = new FileOutputStream(counter+"SaveGame.ser", true); 
     ObjectOutputStream oos = new ObjectOutputStream(fout); 
     oos.writeObject(myClassObj.toString()); 
     counter++; 
     oos.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

對不起,我是新來的Java所以普萊舍藉口任何愚蠢的問題。上面的代碼以ser格式保存數組。我需要將它保存爲二進制格式,然後還可以稍後從二進制格式中讀取它。我不知道你是怎麼做到這雖然

任何幫助深表感謝

+3

你可能不想寫的'的toString()'將對象表示爲磁盤,但是您想*以二進制格式將對象序列化爲流/文件。你的'myClass'類必須實現'Serializable'接口('ArrayList'已經可序列化),那麼你可以調用'oos.writeObject(myClassObj);'。我認爲如果你開始閱讀序列化和反序列化,最好是在http://www.javacoffeebreak.com/articles/serialization/index.html。 –

回答

1

正如其他人所說的,如果你想寫二進制,在序列化對象時不要使用toString()方法。您還需要在class myClass中實施Serializable。然後,使用ObjectInputStream.readObject()進行反序列化就像序列化一樣簡單。

你造成SaveData類,那麼應該是這個樣子:

import java.io.*; 
import java.util.*; 

public class SaveData { 
    int counter = 1; 

    public void saveTheData(ArrayList<myClass> myClassObj) { 
     try { 
      FileOutputStream fout = new FileOutputStream(counter 
        + "SaveGame.ser", true); 
      ObjectOutputStream oos = new ObjectOutputStream(fout); 
      oos.writeObject(myClassObj); 
      counter++; 
      oos.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public ArrayList<myClass> loadTheData(int saveNum) { 
     try { 
      FileInputStream fin = new FileInputStream(saveNum + "SaveGame.ser"); 
      ObjectInputStream ois = new ObjectInputStream(fin); 
      ArrayList<myClass> myClassObj = (ArrayList<myClass>) ois.readObject(); 
      ois.close(); 
      return myClassObj; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

而且myClass會是這個樣子:

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 

public class myClass implements Serializable { 
    private static final long serialVersionUID = /* some UID */; 
    /* ... 
    * class properties 
    */ 

    myClass(/* args */) { 
     // Initialize 
    } 

    /* ... 
    * class methods 
    */ 

    private void writeObject(ObjectOutputStream o) throws IOException { 
     // Write out to the stream 
    } 

    private void readObject(ObjectInputStream o) throws IOException, 
      ClassNotFoundException { 
     // Read in and validate from the stream 
    } 
} 
+0

我是否正確認爲上面的代碼不會以二進制格式保存它? – GreenAddiction

+0

爲什麼我需要這個私有靜態最終long serialVersionUID =/*一些UID * /; – GreenAddiction

+0

序列化[定義](http://stackoverflow.com/questions/633402/what-is-serialization)*是*「將內存中的對象轉換爲字節流的過程」。在java中,對象將按照標準[Java對象序列化規範](http://docs.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html)進行序列化。如果你想以不同的二進制格式表示事物,你必須[自己動手](http://stackoverflow.com/questions/5837698/converting-any-object-to-a-byte-array-in- JAVA)。 – NanoWizard

0

嗯.. myClassObj.toString()

生成一個字符串和那是什麼,你正在寫輸出流。你可以期望一個字符串和其他一些數據在這種情況下定義它的大小,而不是二進制表示。

你可以只使用:

oos.writeObject(myClassObj); 

這是因爲ArrayList的實現Serializable接口。但是,您將依賴於該實現爲實際寫入的情況。 Serializable接口必須支持的唯一契約是對象可以像寫入文件的數據一樣重新創建。

如果要以原始二進制格式將數據寫入文件(可能稍後會從c代碼讀取數據),則必須自行編寫一些循環ArrayList的內容。該代碼將取決於myClass的實現,因此很難給出一個實例。

喜歡的東西:

for (myClass temp : myClassObj) 
{ 
     temp.writeBinaryDataToStream(oos); 
} 

凡writeBinaryDataToStream(OOS)是由你來實現。