将Java对象写入文件

时间:2010-06-13 00:45:37

标签: java file binary persistent-storage

是否可以将Java中的对象写入二进制文件?我想写的对象是2个String对象数组。我想这样做的原因是保存持久数据。如果有更简单的方法,请告诉我。

5 个答案:

答案 0 :(得分:13)

你可以

  1. 序列化数组或类 包含数组。
  2. 将数组写为格式化的两行     方式,如JSON,XML或CSV。
  3. 以下是第一个代码(可以用数组替换Queue) 序列化

    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,然后将其写入文件。阅读相反。

答案 1 :(得分:2)

序列化之外的一种可能性是将对象写入XML文件以使其更易于阅读。 XStream API具有此功能,并使用类似于序列化的方法。

http://x-stream.github.io/

答案 2 :(得分:2)

您可以使用Java的serialization机制来完成它,但要注意序列化不是长期持久存储对象的好方法。原因是序列化对象与Java代码紧密耦合:如果更改程序,则序列化数据文件变得不可读,因为它们与Java代码不再兼容。序列化适用于临时存储(例如,用于磁盘缓存)或通过网络传输对象。

对于长期存储,您应该使用未与Java代码紧密耦合的标准且记录良好的格式(例如XML,JSON或其他内容)。

如果出于某种原因,您绝对想要使用二进制格式,则可以使用多种选项,例如Google protocol buffersHessian

答案 3 :(得分:1)

你需要写对象,而不是课,对吧?因为类已经编译为二进制.class文件。

尝试ObjectOutputStream,有一个例子 http://java.sun.com/javase/6/docs/api/java/io/ObjectOutputStream.html

答案 4 :(得分:1)

如果要编写String数组,最好使用文本文件。使用文本文件的优点是它可以很容易地查看,编辑,并且可以被系统中的许多其他工具使用,这意味着您不必自己编写这些工具。

您还可以发现简单的文本格式比使用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

正如您所见,这很容易编辑/查看。

这对字符串可以包含的内容做了一些假设(参见资产)。如果这些假设无效,就有办法解决这个问题。