如何自动写入和读取文件?

时间:2016-04-26 09:24:04

标签: java fileinputstream fileoutputstream

我有一个包含3 ArrayList个对象的java应用程序:itemscustomersorders

我想知道在关闭应用程序时如何将这些对象写入文件,然后在启动应用程序时如何从文件中读取文件?

这是我给予的帮助我的代码:

//Write to file
ObjectOutputStream outputStream;
outputStream=new ObjectOutputStream(new FileOutputStream("customerFile",true));
outputStream.writeObject(customers);
outputStream.close();

//Read from file 
Clients fileCust = null;
ObjectInputStream inputStream;
inputStream = new ObjectInputStream(new FileInputStream("customerFile"));
fileCust = (Clients)inputStream.readObject();
inputStream.close();

我想我可以通过点击按钮进行读写来弄清楚如何做到这一点,但我想知道如何自动完成。 (当程序开始和结束时)。

2 个答案:

答案 0 :(得分:2)

要在程序开头读取文件,您只需将阅读代码放在开头即可。

但要确保从任何地方退出程序时保存它,您可以使用shutdown hook

Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    // Shutdown code here
}));

您在课程开始时注册。它在JVM关闭时被调用。通过doc:

  

Java虚拟机关闭以响应两种事件:

     
      
  • 当最后一个非守护程序线程退出或调用退出(等效,System.exit)方法时,程序正常退出,或者
  •   
  • 虚拟机将终止以响应用户中断,例如键入^ C或系统范围的事件,例如用户注销或系统关闭。
  •   

现在在你的课程开始时你会做这样的事情:

public static void main(String... args) {
    // getConfig() returns a configuration object read from a file
    // Or a new object if no file was found.
    Configuration config = getConfig();

    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
        ...
        // Note that I'm not appending to, but overwriting the file
        ObjectOutputStream outputStream = 
            new ObjectOutputStream(new FileOutputStream("myConfigFile"));

        outputStream.writeObject(config); // write the config object.
        ...
    }));

    // Rest of the program, using 'config'
}

重要的是要注意,因为在程序结束时执行了关闭钩子,它将写入配置对象的最终状态。因此,考虑在程序期间对“配置”进行的更改。

对于能够像这样编写的对象,他们需要实现java.io.serializable,所以他们的所有字段都是如此。除了具有transient限定符的字段。

配置对象可能如下所示:

public class Configuration implements java.io.Serializable {

    // transient -> Will not be written or read.
    // So it is always 'null' at the start of the program.
    private transient Client lastClient = null;

    // 'Client' must also implement java.io.serializable,
    // for 'Configuration' to be serializable.
    // Otherwise, an exception is thrown when writing the object.
    private List<Client> clients = new ArrayList<Client>();

    // 'String' already implements java.io.serializable.
    private String someString;

    ...
}

答案 1 :(得分:1)

您应该使用Java 序列化系统。

  

Java提供了一种称为对象序列化的机制,其中对象可以表示为包含对象数据的字节序列,以及有关对象类型和存储的数据类型的信息。对象。

     

将序列化对象写入文件后,可以从文件中读取并反序列化,即表示对象及其数据的类型信息和字节可用于在内存中重新创建对象。

Here是官方Java文档的链接,其中包含大量示例。

现在自动执行此操作,您只需在程序开头放置此类指令即可读取文件

当你退出时,你可以使用上面答案的例子。