Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何自动写入和读取文件?_Java_Fileinputstream_Fileoutputstream - Fatal编程技术网

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

Java 如何自动写入和读取文件?,java,fileinputstream,fileoutputstream,Java,Fileinputstream,Fileoutputstream,我有一个java应用程序,它有3个ArrayList对象:项目,客户和订单 我想知道在关闭应用程序时如何将这些对象写入文件,然后在启动应用程序时如何读取文件 这是给我的帮助代码: //Write to file ObjectOutputStream outputStream; outputStream=new ObjectOutputStream(new FileOutputStream("customerFile",true)); outputStream.writeObject(custom

我有一个java应用程序,它有3个
ArrayList
对象:
项目
客户
订单

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

这是给我的帮助代码:

//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();

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

您应该使用Java序列化系统

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

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

是指向官方Java文档的链接,其中包含许多示例

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


退出时,您可以使用上面答案的示例。

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

但为了确保在您从任何地方退出程序时将其保存,您可以使用:

在程序开始时注册。它在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'
}
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;

    ...
}
需要注意的是,由于shutdownhook是在程序结束时执行的,因此它将写入config对象的最终状态。因此,在程序中对“配置”所做的更改将被考虑在内


为了使对象能够像这样编写,它们需要实现
java.io.serializable
,它们的所有字段也是如此。除了具有
临时限定符的字段

配置对象可能如下所示:

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

    ...
}
公共类配置实现java.io.Serializable{
//瞬态->将不会被写入或读取。
//因此,它在程序开始时总是“null”。
私有临时客户端lastClient=null;
//“客户端”还必须实现java.io.serializable,
//使“配置”可序列化。
//否则,在写入对象时会引发异常。
private List clients=new ArrayList();
//“String”已实现java.io.serializable。
私有字符串someString;
...
}

可能重复我在理解您的问题时遇到问题。。。“当程序开始和结束时”是什么意思?如果你想加载和保存一些操作,为什么不在程序开始和结束时执行它们?@ParkerHalo-Oh所以我要做的就是把代码放在程序开始处?我认为有一种语法可以让它在程序启动时自动启动,并在我关闭program@shawnmurray1337这实际上取决于您试图做什么,但是如果您想在使用任何其他代码之前从文件中加载某些内容,那么是的,您只需在代码的开始/开始插入代码program@ParkerHalo是,当我启动程序时,我希望用保存在文件中的内容填充ArrayList。我认为自动完成是最好的方法。我会尽量把代码放在开头和结尾。谢谢你。答案是恰当的。