【问题标题】:How to automatically write and read from files?如何自动写入和读取文件?
【发布时间】:2016-08-20 00:44:56
【问题描述】:

我有一个具有 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();

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

【问题讨论】:

  • 我在理解你的问题时遇到了问题......“程序何时开始和结束”是什么意思?如果你想进行一些加载和保存操作,为什么不在开始时实现它们在程序结束时?
  • @ParkerHalo 哦,我所要做的就是将代码放在程序的开头?我认为有一种语法可以让它在程序启动时自动启动,并在我关闭程序时自动保存
  • @shawnmurray1337 这实际上取决于您要执行的操作,但是如果您想在使用任何其他代码之前从文件中加载某些内容,那么是的,您只需在开头插入代码/程序开始
  • @ParkerHalo 是的,当我启动程序时,我希望使用保存在文件中的内容填充数组列表。我认为自动执行此操作是最好的方法。我将尝试将代码放在开头和结尾。谢谢

标签: java fileinputstream fileoutputstream


【解决方案1】:

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

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

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

Here 是一个包含大量示例的官方 Java 文档的链接。

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

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

【讨论】:

  • 已编辑。答案是合适的。
【解决方案2】:

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

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

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

您在程序开始时注册。它在 JVM 关闭时被调用。由文档:

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

  • 程序正常退出,当最后一个非守护线程退出或调用 exit(等效于 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'
}

需要注意的是,由于shutdown hook是在程序结束时执行的,它会写入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;

    ...
}

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2015-09-17
    相关资源
    最近更新 更多