以二进制格式保存数组
Save array in binary format
我有以下数组列表
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 格式。我需要将它保存为二进制格式,然后才能从二进制格式中读取它。不过我不知道你是怎么做到的
非常感谢任何帮助
嗯..
myClassObj.toString()
生成一个字符串,这就是您要写入输出流的内容。在这种情况下,您可以期待一个字符串和一些其他定义它的大小的数据,而不是二进制表示。
您可以使用:
oos.writeObject(myClassObj );
那是因为 ArrayList 实现了 Serializable 接口。但是,对于那种情况下实际编写的内容,您将依赖于该实现。 Serializable 接口必须支持的唯一约定是对象可以像只用写入文件的数据一样重新创建。
如果你想以原始二进制格式将数据写入文件(例如可能稍后从 c 代码中读取它),你必须自己编写一些循环 ArrayList 的东西。该代码将取决于 myClass 的实现,因此很难给出一个工作示例。
类似于:
for (myClass temp : myClassObj)
{
temp.writeBinaryDataToStream(oos);
}
writeBinaryDataToStream(oos) 由您来实现。
正如其他人所说,如果你想写二进制,在序列化对象时不要使用toString()
方法。您还需要在 class myClass
中实现 Serializable
。然后反序列化就和序列化一样简单了,使用ObjectInputStream.readObject()
.
你的结果 SaveData
class 应该看起来像这样:
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
}
}
我有以下数组列表
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 格式。我需要将它保存为二进制格式,然后才能从二进制格式中读取它。不过我不知道你是怎么做到的
非常感谢任何帮助
嗯.. myClassObj.toString()
生成一个字符串,这就是您要写入输出流的内容。在这种情况下,您可以期待一个字符串和一些其他定义它的大小的数据,而不是二进制表示。
您可以使用:
oos.writeObject(myClassObj );
那是因为 ArrayList 实现了 Serializable 接口。但是,对于那种情况下实际编写的内容,您将依赖于该实现。 Serializable 接口必须支持的唯一约定是对象可以像只用写入文件的数据一样重新创建。
如果你想以原始二进制格式将数据写入文件(例如可能稍后从 c 代码中读取它),你必须自己编写一些循环 ArrayList 的东西。该代码将取决于 myClass 的实现,因此很难给出一个工作示例。
类似于:
for (myClass temp : myClassObj)
{
temp.writeBinaryDataToStream(oos);
}
writeBinaryDataToStream(oos) 由您来实现。
正如其他人所说,如果你想写二进制,在序列化对象时不要使用toString()
方法。您还需要在 class myClass
中实现 Serializable
。然后反序列化就和序列化一样简单了,使用ObjectInputStream.readObject()
.
你的结果 SaveData
class 应该看起来像这样:
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
}
}