将 Java 对象写入文件

问题描述 投票:0回答:6

是否可以将Java中的对象写入二进制文件?我想要写入的对象是 2 个

String
对象数组。我想这样做的原因是保存持久数据。如果有更简单的方法,请告诉我。

java file binary persistent-storage
6个回答
13
投票

你可以

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


2
投票

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

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

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


2
投票

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

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


1
投票

如果您想写入字符串数组,那么使用文本文件可能会更好。使用文本文件的优点是可以轻松查看、编辑它,并且可以由系统中的许多其他工具使用,这意味着您不必自己编写这些工具。

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

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

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


1
投票

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

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


0
投票

您可以序列化反序列化您的自定义对象。

如何实现序列化:

  1. 为您的班级添加
    implements Serializable
  2. 实现方法
    private void writeObject(ObjectOutputStream out) throws IOException;
  3. 实施
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

您可以使用可序列化接口来实现:

public class Example implements Serializable {
    private static final long serialVersionUID = 1L;
    private String ExampleDescription exampleDescription;

    // setters and getters

    private void writeObject(ObjectOutputStream oos) 
      throws IOException {
        oos.defaultWriteObject();
        oos.writeObject(exampleDescription.getMainInformation());
    }

    private void readObject(ObjectInputStream ois) 
      throws ClassNotFoundException, IOException {
        ois.defaultReadObject();
        String exampleDescription = (String) ois.readObject();
        this.setExampleDescription(exampleDescription );
    }
}

更多详细信息:Baeldung:3.3。 Java 中的自定义序列化

© www.soinside.com 2019 - 2024. All rights reserved.