当前位置: 首页 > 知识库问答 >
问题:

文件加载的IOException问题-Java/

田硕
2023-03-14

如何解决从文件加载ArrayList的问题?

完整代码在git上:项目github链接

当我从文件中加载数据时,我会把它拿回来-

我正在学习使用流,所以我正在将其写入文件。

程序结束后,我想在数组列表中写下用户到达的时间,并列出游戏完成的所有时间。

package sk.games.puzzle;

import java.io.*;
import java.util.*;

public class BestTimes implements Iterable<BestTimes.PlayerTime>, Serializable{

    private static final String BESTTIME_DB = System.getProperty("user.home")
            + System.getProperty("file.separator")
            + "best_time_db.db";

    private List<PlayerTime> playerTimes = new ArrayList<>();

    public Iterator<PlayerTime> iterator() {
        return playerTimes.iterator();
    }

    public void addTime(String name, int time){
        playerTimes.add(new PlayerTime(name, time));
        Collections.sort(playerTimes);
        this.save();
    }

    public void load() {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(BESTTIME_DB);
        } catch (FileNotFoundException e) {
            System.err.println("Fail db neexistuje");
        } finally {
            if (fis != null) {
                ObjectInputStream ois = null;
                try {
                    ois = new ObjectInputStream(fis);
                    if (ois != null) {
                        try {
                            playerTimes = (ArrayList<PlayerTime>) ois.readObject();
                        } catch (ClassNotFoundException e) {
                            System.err.println("Fail nebola najdena trieda");
                        }
                    } else {
                    }
                    assert ois != null;
                    ois.close();
                    } catch (IOException e) {
                    System.err.println("Fail nepodarilo sa otvoril db");
                }
            }
        }
    }

    public void save() {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(BESTTIME_DB);
        } catch (FileNotFoundException e) {
            System.err.println("Fail db neexistuje");
        } finally {
            if (fos != null) {
                ObjectOutputStream oos = null;
                try{
                    oos = new ObjectOutputStream(fos);
                    if (oos != null) {
                        oos.writeObject(playerTimes);
                    }
                    assert oos != null;
                    oos.close();
                } catch (IOException e) {
                    //empty
                }
            }
        }
    }

    @Override
    public String toString() {
        Formatter f = new Formatter();
        for (int i = 0; i < playerTimes.size(); i++) {
            PlayerTime pt = playerTimes.get(i);
            f.format("%02d. %s - %ds.\n", i, pt.getName(), pt.getTime());
        }
        return f.toString();
    }

    public static class PlayerTime implements Comparable<PlayerTime> {

        private final String name;
        private final int time;

        public PlayerTime(String name, int time) {
            this.name = name;
            this.time = time;
        }

        public String getName() {
            return name;
        }

        public int getTime() {
            return time;
        }

        @Override
        public int compareTo(PlayerTime o){
            return Integer.compare(this.time, o.getTime());
        }
    }
}

共有1个答案

方高丽
2023-03-14

问题是您的PlayerTime类不可序列化。

<代码>公共静态类PlayerTime实现可比较

应该是

<代码>公共静态类PlayerTime实现可比较

除非将对象写入文件,否则没有必要使最佳时间可序列化。

 类似资料:
  • 问题内容: 我是javaFx的新手,并且希望使用scenebuilder进行GUI开发,尽管遇到了类似的问题,但仍可能需要不同的观点,但我遇到了一个问题,尽管在网站或Web上搜索我的运气都不好。我试图在快速构建以测试功能后通过Netbeans加载FXML文件,以便代码简单,但是我无法在控制器中设置根文件。我的代码是以下公共类Divergex扩展的Application { 我尝试过将fxroot更

  • 刚接触javaFx并希望使用scenebuilder进行GUI开发时,我遇到了一个问题,在网站上或整个web上搜索我的问题时都没有运气,尽管有人问过类似的问题,认为可能需要一个不同的视角。我试图在快速构建之后通过Netbeans加载一个FXML文件,以测试功能,这样代码就简单了,但是我无法在控制器中设置根文件。我的代码是下面的公共类Divergex extends Application{ 我尝试

  • 在edge中,我正在访问一个JSP页面,该页面会返回一个文件。它在chrome中工作得很好,但在Edge和Internetexplorer中,我会将mime类型附加到文件名中。 这是响应标头: Edge要求我保存文件,文件名是 persistenceIDs.xlsx.vnd.openxmlformats-officedocument.spreadsheetml.sheet 有什么想法吗?

  • 我是一个长期LAMP开发人员,并且习惯在需要时使用autoloader加载类,但直到那时才开始,但现在正在学习Node.js。许多示例显示了加载所有文件的文件夹中的index.js文件。 例如:模型 在我的代码中,我使用 这是首选方法吗? 如果是,为什么? 为什么不使用自动装载机,只在需要的时候加载文件呢? 我在网上搜索,但没有找到任何明确解释这一点的东西。如果你有一篇文章对你有帮助,我将不胜感激

  • 问题内容: 我正在应用程序中下载动态文件,并使用iframe来模拟ajax。我正在做的是,当下载请求发出后,我将创建一个动态的不可见iframe,并将iframe的src设置为下载网址。我能够成功下载该文件,但要求是显示一个下载下载指示器一旦开始下载,并在下载对话框出现后立即完成。我在创建iframe后提供了回调,以显示下载指示器已成功运行,并在iframe的“ onload”上提供了另一种方法,

  • 在java.util.scanner.throwfor(未知源)在java.util.scanner.next(未知源)在java.util.scanner.nextint(未知源)在java.util.scanner.nextint(未知源) 文件顺序:string string int int int