是否可以将 Java 中的对象写入二进制文件?我要编写的对象将是 2 个String
对象数组。我想这样做的原因是为了保存持久数据。如果有更简单的方法可以让我知道。
5 回答
你可以
- 序列化数组或包含数组的类。
- 以格式化的方式将数组写成两行,例如 JSON、XML 或 CSV。
这是第一个的一些代码(您可以用数组替换队列) 序列化
public static void main(String args[]) {
String[][] theData = new String[2][1];
theData[0][0] = ("r0 c1");
theData[1][0] = ("r1 c1");
System.out.println(theData.toString());
// serialize the Queue
System.out.println("serializing theData");
try {
FileOutputStream fout = new FileOutputStream("thedata.dat");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(theData);
oos.close();
}
catch (Exception e) { e.printStackTrace(); }
}
反序列化
public static void main(String args[]) {
String[][] theData;
// unserialize the Queue
System.out.println("unserializing theQueue");
try {
FileInputStream fin = new FileInputStream("thedata.dat");
ObjectInputStream ois = new ObjectInputStream(fin);
theData = (Queue) ois.readObject();
ois.close();
}
catch (Exception e) { e.printStackTrace(); }
System.out.println(theData.toString());
}
第二个更复杂,但具有人性化和其他语言可读的优点。
以 XML 格式读写
import java.beans.XMLEncoder;
import java.beans.XMLDecoder;
import java.io.*;
public class XMLSerializer {
public static void write(String[][] f, String filename) throws Exception{
XMLEncoder encoder =
new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream(filename)));
encoder.writeObject(f);
encoder.close();
}
public static String[][] read(String filename) throws Exception {
XMLDecoder decoder =
new XMLDecoder(new BufferedInputStream(
new FileInputStream(filename)));
String[][] o = (String[][])decoder.readObject();
decoder.close();
return o;
}
}
往返 JSON
Google 在http://code.google.com/p/google-gson/上有一个很好的库可以在 JSON 之间进行转换。 您可以简单地将对象写入 JSOn,然后将其写入文件。阅读则相反。
除了序列化之外,一种可能性是将对象写入 XML 文件以使它们更易于阅读。XStream API 能够做到这一点,并使用类似于序列化的方法。
您可以使用 Java 的序列化机制来做到这一点,但请注意,序列化不是长期持久存储对象的好解决方案。这样做的原因是序列化对象与您的 Java 代码非常紧密耦合:如果您更改程序,那么序列化数据文件将变得不可读,因为它们不再与您的 Java 代码兼容。序列化适用于临时存储(例如磁盘缓存)或通过网络传输对象。
对于长期存储,您应该使用与 Java 代码不紧密耦合的标准且文档齐全的格式(例如 XML、JSON 或其他格式)。
如果出于某种原因,您绝对想使用二进制格式,那么有几个可用的选项,例如Google 协议缓冲区或Hessian。
你需要写对象,而不是类,对吧?因为类已经编译为二进制 .class 文件。
试试 ObjectOutputStream,有一个例子
http://java.sun.com/javase/6/docs/api/java/io/ObjectOutputStream.html
如果要编写字符串数组,最好使用文本文件。使用文本文件的优点是它可以很容易地查看、编辑,并且可以被系统中的许多其他工具使用,这意味着您不必自己编写这些工具。
您还可以发现,与使用 XML 或 JSON 相比,简单的文本格式会更快、更紧凑。注意:这些格式对于复杂的数据结构更有用。
public static void writeArray(PrintStream ps, String... strings) {
for (String string : strings) {
assert !string.contains("\n") && string.length()>0;
ps.println(strings);
}
ps.println();
}
public static String[] readArray(BufferedReader br) throws IOException {
List<String> strings = new ArrayList<String>();
String string;
while((string = br.readLine()) != null) {
if (string.length() == 0)
break;
strings.add(string);
}
return strings.toArray(new String[strings.size()]);
}
如果你开始
String[][] theData = { { "a0 r0", "a0 r1", "a0 r2" } {"r1 c1"} };
这可能导致
a0 r0
a0 r1
a0 r2
r1 c1
如您所见,这很容易编辑/查看。
这对字符串可以包含的内容做出了一些假设(请参阅资产)。如果这些假设不成立,有办法解决这个问题。