以二进制格式保存数组

时间:2016-01-02 22:17:41

标签: java io save fileoutputstream

我有以下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格式保存数组。我需要以二进制格式保存它,然后能够稍后从其二进制格式中读取它。我不知道你是怎么做的

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

如其他人所述,如果您想编写二进制文件,请在序列化对象时不要使用toString()方法。您还需要在Serializable中实施class myClass。然后通过使用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
    }
}

答案 1 :(得分:0)

嗯..     myClassObj.toString()

生成一个String,这就是你要写入输出流的内容。在这种情况下,您可以期望一个字符串和一些其他数据来定义它的大小而不是二进制表示。

你可以使用:

oos.writeObject(myClassObj );

那是因为ArrayList实现了Serializable接口。但是,在这种情况下,您将依赖于实际写入的实现。 Serializable接口必须支持的唯一合同是,只需将数据写入文件即可重新创建对象。

如果你想以原始二进制格式将数据写入文件(例如,稍后可能从c代码中读取它),你必须自己编写一些循环ArrayList的东西。该代码将取决于myClass的实现,因此很难给出一个有效的例子。

类似的东西:

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

writeBinaryDataToStream(oos)由你来实现。