【问题标题】:Java- Save object data to a file [closed]Java-将对象数据保存到文件[关闭]
【发布时间】:2012-05-26 02:56:51
【问题描述】:

我已经看过很多不同的帖子,关于您应该以何种方式将对象序列化为文件,并且所有这些帖子在本质上都在如何做到这一点以及最佳实践是什么方面存在冲突。所以这就是我要保存的内容:

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?
  }

【问题讨论】:

  • 您必须先确定格式。二进制? XML? JSON?专有?
  • “并且它们在如何做以及最佳实践是什么方面都存在本质上的冲突。” 最佳方法通常取决于确切的要求。对象序列化在特定情况下可能会很好,但是在未来的 JRE 中缺乏可读性保证限制了它的实用性。要获得最佳答案,请提供更多上下文。您要保存 1 个对象还是 100,000 个对象?是在启动/关闭时发生读/写,由用户选择,还是每 87 毫秒自动发生一次?
  • 我不介意它在 xml 中,但如果这不可能,那么我可以将它写在其他东西中,然后将整个对象拉入。
  • 这里没有问题。

标签: java class object serialization


【解决方案1】:

我假设,您想将对象直接写入文件

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;
}

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

【讨论】:

  • 然而该类必须实现Serializable
【解决方案2】:

如何序列化对象的示例:

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

【讨论】:

    【解决方案3】:

    您可以使用 XMLDecoder/XMLEncoder 将 JavaBean 序列化为 xml。以下是 oracle 的 Javadocs 中关于这两个类的示例:

    (XML解码器)

       XMLDecoder d = new XMLDecoder(
                          new BufferedInputStream(
                              new FileInputStream("Test.xml")));
       Object result = d.readObject();
       d.close();
    

    (XML编码器)

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

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

    【讨论】:

      【解决方案4】:

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

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

      如果你想从那个文件中读取 IHandler,需要这样做

      ObjectInputStream ois = new ObjectInputStream(fos); 
      IHandler iHandler = (IHandler) ois.readObject();
      

      【讨论】:

        猜你喜欢
        • 2013-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-13
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        相关资源
        最近更新 更多