【问题标题】:Write Java objects to file将 Java 对象写入文件
【发布时间】:2010-06-13 00:45:37
【问题描述】:

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

【问题讨论】:

  • 我改变了我的问题,因为我想我不想写课程。
  • 比什么容易?

标签: java file binary persistent-storage


【解决方案1】:

你可以

  1. 序列化数组或类 包含数组。
  2. 将数组写成两行格式 方式,例如 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,然后将其写入文件。阅读则相反。

【讨论】:

  • +1 JSON 在这里可以工作,但在一般序列化中使用它时要小心——它不支持循环引用。
  • 在您序列化的每个相关对象(如果有)上也实现 Serializable 非常重要。实施后,它会要求您生成密钥。也这样做。
【解决方案2】:

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

对于长期存储,您应该使用与 Java 代码不紧密耦合的标准且文档齐全的格式(例如 XML、JSON 或其他格式)。

如果出于某种原因,您绝对想使用二进制格式,那么有几个可用选项,例如 Google protocol buffersHessian

【讨论】:

  • 只有当您没有定义serialVersionUID 并且您违反了对象序列化规范,版本控制一章中指定的规则时,以“如果您更改程序”开头的部分才是正确的。
【解决方案3】:

除了序列化之外,还有一种可能性是将对象写入 XML 文件以使它们更易于阅读。 XStream API 能够做到这一点,并使用类似于序列化的方法。

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

【讨论】:

    【解决方案4】:

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

    您还可以发现,与使用 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
    

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

    这对字符串可以包含的内容做了一些假设(请参阅资产)。如果这些假设不成立,有办法解决这个问题。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 请注意,序列化对于长期持久性并不是很好,请参阅我的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 2015-07-09
      • 2013-10-04
      相关资源
      最近更新 更多