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)