Java - 将对象数据保存到文件

7

我看到了很多关于如何将对象序列化到文件的不同帖子,它们在如何执行和最佳实践上存在冲突。所以这就是我想要保存的内容:

public class IHandler{
    public double currentLoad;
    public String currentPrice;
    public String configArgs[];
};

我们可以假设configArgs的大小是已知的,我需要创建一个文件,以下是我目前所拥有的内容。
public static void serializeDataOut(IHandler ISH)throws IOException{
    String fileName= "Test.txt";
    FileOutputStream fos = new FileOutputStream(fileName);
        //What do I do here?
    }

  public static IHandler serializeDataIn(){
      //What do I do here?
  }

1
你必须先决定一个格式。二进制?XML?JSON?专有的? - JB Nizet
1
“它们的本质冲突在于如何实现以及最佳实践是什么。” 最佳方式通常取决于确切的要求。对象序列化可能适用于特定情况,但未来 JRE 可读性的缺乏限制了其效用。为了获得最佳答案,请提供更多上下文。您是要保存一个对象还是 100,000 个对象?是在启动/关闭时进行读写,还是由用户选择或自动每 87 毫秒进行一次? - Andrew Thompson
我不介意它是在XML中,但如果不可能的话,我可以用其他语言编写它,然后稍后将整个对象提取出来。 - A_Elric
2
我这里没有看到问题。 - Raedwald
4个回答

11

我假设你想要直接将对象写入文件。

public static void serializeDataOut(IHandler ish)throws IOException{
    String fileName= "Test.txt";
    FileOutputStream fos = new FileOutputStream(fileName);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(ish);
    oos.close();
}

public static IHandler serializeDataIn(){
   String fileName= "Test.txt";
   FileInputStream fin = new FileInputStream(fileName);
   ObjectInputStream ois = new ObjectInputStream(fin);
   IHandler iHandler= (IHandler) ois.readObject();
   ois.close();
   return iHandler;
}

我刚刚提供了重要的代码,请使用异常处理来实现它。


3
然而,这个类必须实现Serializable接口。 - leet

4
一个对象序列化的示例:
public static void writeToFile(File path, Database data)
{
    try(ObjectOutputStream write= new ObjectOutputStream (new FileOutputStream(path)))
    {
        write.writeObject(data);
    }
    catch(NotSerializableException nse)
    {
        //do something
    }
    catch(IOException eio)
    {
        //do something
    }
}


public static Object readFromFile(File path)
{
    Object data = null;

    try(ObjectInputStream inFile = new ObjectInputStream(new FileInputStream(path)))
    {
        data = inFile.readObject();
        return data;
    }
    catch(ClassNotFoundException cnfe)
    {
        //do something
    }
    catch(FileNotFoundException fnfe)
    {
        //do something
    }
    catch(IOException e)
    {
        //do something
    }
    return data;
}   

更多信息请参考http://docs.oracle.com/javase/tutorial/jndi/objects/serial.html


1
你可以使用XMLDecoder /XMLEncoder 将JavaBean序列化为xml。以下是来自Oracle Javadoc有关这两个类的示例:
( XMLDecoder )
   XMLDecoder d = new XMLDecoder(
                      new BufferedInputStream(
                          new FileInputStream("Test.xml")));
   Object result = d.readObject();
   d.close();

(XMLEncoder) (编码器)
   XMLEncoder e = new XMLEncoder(
                      new BufferedOutputStream(
                          new FileOutputStream("Test.xml")));
   e.writeObject(new JButton("Hello, world"));
   e.close();

请注意,您需要添加getter和setter并使类可序列化。

0

你想将 IHandler 写入 test.txt 文件吗?尝试一下

ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.write(IHandler);

如果你想从那个文件中读取 IHandler,需要这样做。
ObjectInputStream ois = new ObjectInputStream(fos); 
IHandler iHandler = (IHandler) ois.readObject();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接