Java 将对象写入文件

Java 将对象写入文件,java,eofexception,Java,Eofexception,我试图做的是将哈希映射写入文件。当立即运行时,下面的代码将正确显示。但是,当我尝试运行仅将对象写入文件,并尝试单独运行读取写入的对象到文件时,会引发以下异常 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOu

我试图做的是将哈希映射写入文件。当立即运行时,下面的代码将正确显示。但是,当我尝试运行仅将对象写入文件,并尝试单独运行读取写入的对象到文件时,会引发以下异常

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;

public class FileIo {
    String fileName;
    FileOutputStream fos;
    FileInputStream fis;
    ObjectOutputStream oos;
    ObjectInputStream ois;

    public FileIo(String fileName) {
        this.fileName = fileName;
        File file = new File(fileName);
        try {
            if (!file.exists()) {
                file.createNewFile();
                System.out.println("created");
            }
            fos = new FileOutputStream(fileName);
            fis = new FileInputStream(fileName);
            oos = new ObjectOutputStream(fos);
            ois = new ObjectInputStream(fis);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void writeToFile(Object obj) {
        try {
            oos.writeObject(obj);
            oos.flush();
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();

        }

    }

    public Object readFromFile() {
        try {
            return ois.readObject();
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        }

        return null;

    }

    @SuppressWarnings("unchecked")
    public static void main(String args[]) {
        HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
        FileIo fi = new FileIo("tex.txt");
        //Only write to the file
        ArrayList<String> a = new ArrayList<>();
        a.add("test");
        map.put("testput", a);
        fi.writeToFile(map);
        //Only write to the file
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //Only read from the file
        map = null;
        map = (HashMap<String, ArrayList<String>>) fi.readFromFile();
        System.out.println(map.toString());
    }
}

唯一不同的是,不是直接写,而是立即读。我首先编写对象程序,然后运行程序来读取对象

数据写入文件后,需要创建
FileInputStream


您不能在之前创建它,并假定它将显示随后写入的数据。

您需要在数据写入文件后创建
文件输入流


您不能在之前创建它,并假定它将显示随后写入的数据。

您需要在数据写入文件后创建
FileInputStream
。您不能在之前创建它,并假定它将显示随后写入的数据。请将其添加为答案@AndyTurner:D@AndyTurner当我按原样运行代码时,代码运行良好。但是当我稍微修改代码时,在任何给定的时间,我要么写入文件,要么读取文件。所以在我尝试做的事情中,首先运行程序只写文件,然后重新运行程序从中读取,抛出上面的异常。因此,在这种情况下,FileInputStream将始终在数据写入文件后创建。您是否在每次读/写时都对内容进行注释?因为你的main一直在修改内容。尝试andy的解决方案,将filestream/objectstream构造函数移到读/写方法中,而不是在构造函数中创建它们。
exists/createNewFile
块完全是在浪费时间和空间
newfileoutputstream
已经创建了一个新文件,如果它存在,则删除它,或者更确切地说,当构建
FileOutputStream
时,操作系统会这样做。您只是将所需的工作量增加了三倍。您需要在数据写入文件后创建
FileInputStream
。您不能在之前创建它,并假定它将显示随后写入的数据。请将其添加为答案@AndyTurner:D@AndyTurner当我按原样运行时,代码工作正常。但是当我稍微修改代码时,在任何给定的时间,我要么写入文件,要么读取文件。所以在我尝试做的事情中,首先运行程序只写文件,然后重新运行程序从中读取,抛出上面的异常。因此,在这种情况下,FileInputStream将始终在数据写入文件后创建。您是否在每次读/写时都对内容进行注释?因为你的main一直在修改内容。尝试andy的解决方案,将filestream/objectstream构造函数移动到只读/写入方法中,而不是在构造函数中创建它们。
exists/createNewFile
块完全浪费了时间和空间
newfileoutputstream
已经创建了一个新文件,如果它存在,则删除它,或者更确切地说,当构建
FileOutputStream
时,操作系统会这样做。您只是将所需的工作增加了三倍。这里的一般问题是,您应该创建流,并在最后一个可能的时刻读取流。因此,您不应该在构造函数中创建它们,而应该在实际需要对它们进行写入/读取时创建它们。(这样,如果没有人写或读,你也不会浪费打开它们的时间,就像你写了一次但读了很多次)这里的一般问题是,你应该创建你的流,并在最后一个可能的瞬间从中读取。因此,您不应该在构造函数中创建它们,而应该在实际需要对它们进行写入/读取时创建它们。(这样,如果没有人写或读,你也不会浪费打开它们的时间,就像你写了一次,却读了很多次)
    java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2608)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1319)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
    at FileIo.readFromFile(FileIo.java:49)
    at FileIo.main(FileIo.java:73)