Java 为什么我的序列化文件是0字节?为什么读取它们时会抛出EOF错误?

Java 为什么我的序列化文件是0字节?为什么读取它们时会抛出EOF错误?,java,serialization,eof,Java,Serialization,Eof,我正在做一个游戏项目,我正在创建一个保存功能。我使用序列化文件来直接保存对象并在以后检索它们。我只需要保存一个数组列表,其中方向是一个自定义枚举,包含向上,向下,左,右,空和重新启动,用于特殊上下文 在我的代码中,我创建了一个ArrayList,其中包含用户自游戏开始以来所做的每一个动作,并创建了一个保存按钮,将该ArrayList存储在一个文件中。在文件中写入对象似乎很好,没有抛出错误或其他任何错误。当使用load按钮从文件中检索对象时,我得到一个EOF错误(错误写在代码下面) 我注意到我的文

我正在做一个游戏项目,我正在创建一个保存功能。我使用序列化文件来直接保存对象并在以后检索它们。我只需要保存一个
数组列表
,其中
方向
是一个自定义枚举,包含
向上
向下
重新启动
,用于特殊上下文

在我的代码中,我创建了一个
ArrayList
,其中包含用户自游戏开始以来所做的每一个动作,并创建了一个保存按钮,将该ArrayList存储在一个文件中。在文件中写入对象似乎很好,没有抛出错误或其他任何错误。当使用load按钮从文件中检索对象时,我得到一个EOF错误(错误写在代码下面)

我注意到我的文件是0字节,这让我怀疑数据是否真的写入了文件中,这可以解释EOF错误。我尝试过更改文件扩展名,关闭前刷新
ObjectOutputStream
,更改文件名,但这些似乎都无法解决问题。显然,我需要理解为什么我的文件是0字节(从而阻止我检索任何数据)以及为什么在读取文件时出现EOF错误

以下是使用的代码:

公共类LevelSaver{
公共LevelSaver(){
}
公共void存储级别(ArrayList movesHistory,字节级别)引发IOException{
字符串fileName=“level”+(level<10?“0”+level:level);
DateTimeFormatter formatter=模式的DateTimeFormatter.of(“dd-MM-yyyy@HH-MM-ss”);
字符串currentTime=LocalDateTime.now().format(格式化程序);
文件名+=“”+currentTime;
文件名+=“.moves”;
File saveFile=新文件(“src\\main\\resources\\level\\saves\\\”+文件名);
FileOutputStream FileOutputStream=null;
ObjectOutputStream ObjectOutputStream=null;
试一试{
fileOutputStream=新的fileOutputStream(“src\\main\\resources\\level\\saves”+文件名);
objectOutputStream=新的objectOutputStream(fileOutputStream);
objectOutputStream.writeObject(移动存储);
objectOutputStream.flush();
}捕获(IOException异常){
异常。printStackTrace();
}
saveFile.createNewFile();
}
公共ArrayList getHistory(字符串文件名){
FileInputStream FileInputStream=null;
ObjectInputStream ObjectInputStream=null;
试一试{
fileInputStream=newfileinputstream(“src\\main\\resources\\level\\saves\\\”+文件名);
objectInputStream=新的objectInputStream(fileInputStream);
返回(ArrayList)objectInputStream.readObject();
}捕获(IOException | ClassNotFoundException e){
e、 printStackTrace();
}最后{
if(fileInputStream!=null){
试一试{
fileInputStream.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
if(objectInputStream!=null){
试一试{
objectInputStream.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
返回新的ArrayList();
}
}
saveLevel()
创建一个
.mov
文件,其中包含
ArrayList
,并且
getHistory()
返回存储在文件中的
ArrayList
。至少他们应该这么做

下面是使用分别保存和加载移动历史的F键和G键时发生的情况

案例F:
试一试{
levelSaver.saveLevel(movesHistory,currentLevel);
}捕获(IOE异常){
e、 printStackTrace();
}
方向=方向.NULL;
打破
案例G:
//我直接指定了这个文件,文件名是正确的
ArrayList res=levelSaver.getHistory(“level06 09-04-2021@22-08-57.mov”);
方向=方向.NULL;
for(方向:res){
系统输出打印(“应用:+dir”);
//应用移动应用给定移动并更改屏幕上显示的地图
applyMove(dir);
}
打破
这是我在使用加载函数时得到的错误。创建ObjectInputStream时出错

java.io.EOFException
位于java.base/java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2932)
位于java.base/java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3427)
位于java.base/java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:962)
位于java.base/java.io.ObjectInputStream。(ObjectInputStream.java:405)
位于model.LevelSaver.getHistory(LevelSaver.java:41)
at view.PlayingMenu$1.handle(PlayingMenu.java:150)
at view.PlayingMenu$1.handle(PlayingMenu.java:87)
位于javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
位于javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
位于javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
位于javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
在javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
位于javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
在javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
在javafx.base/com.sun.javafx.event.EventDispatchChain
    try (FileOutputStream fileOutputStream = new FileOutputStream("src\\main\\resources\\level\\saves" + fileName);
         ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream)) {
        objectOutputStream.writeObject(movesHistory);
    } catch (IOException exception) {
        exception.printStackTrace();
    }