在java中创建并读取一个只包含最高分的文本文件[关闭]。

问题描述 投票:0回答:1

所以我创建了一个游戏,其中包括一个分数指示器,可以在gui屏幕的右上角显示分数,也可以在输赢屏幕中显示。

现在,我想创建一个txt文件,将存储最高的分数,曾经达到的。这意味着。

  1. 只有在没有txt文件的情况下才会创建一个txt文件(这意味着我需要使用file.existence条件)。
  2. 如果现在没有写分数的文件存在,但如果已经有了文件,那么我需要有人读取文件的数据,把它变成一个int,然后和当前的分数进行比较。然后,用这两个分数之间的最高值更新文件。

这个文件将只包括一行,内容如下: 到目前为止,最高分是。三十.

我试图阅读JAVA io,但我迷失了方向,因为我有太多的类,我的工作.我的意思是我有mainGame类通过创建一个关卡名称列表来运行整个操作,然后将该列表发送到一个名为GameFlow的类,该类将对该列表进行循环运行,并为每个关卡运行一个动画。

所以我想在mainGame中创建一个新的txt文件,然后在GameFlow的关卡循环结束时(这意味着游戏结束),将最终的分数发送到一个新的类,我称之为 "HighScores "或其他什么的,它将获得我在mainGame中创建的文件和GameFlow中的分数,并通过比较该文件中已有的分数来更新txt文件。

但我迷路了...

我很高兴能得到一些帮助.我在想也许在把高分值写入文件之前,先把它放到一个临时的int变量中,这样我就能在每次我想比较的时候用它来比较.谢谢。

java io text-files game-physics
1个回答
0
投票

在java中,有两个API来处理文件。你所描述的情况,用旧的要难很多,我建议你用新的。

你的想法是使用 File's exists 方法不能工作。比方说,你检查文件存在,但它不存在。紧接着在你的系统上运行的另一个进程,或者另一个线程,就会做出这个文件。然后你覆盖它--现在你已经破坏了你的申请条件。

一般来说,为了'安全'地做事,你不会去用'检查条件,然后行动'的格言。

不,你的做法是 "一边行动一边说明你的要求,然后再处理失败的问题"。

不幸的是,那里有一个问题。你可以声明一个要求,即如果一个文件还没有以原子的方式存在,那么它只能被写入。Files.write(p, "The string to put in there", StandardOpenOption.CREATE_NEW); 会失败 FileAlreadyExistsException 如果文件存在,并且是原子性的(这意味着,不可能两个进程调用这个文件,并以某种方式认为文件不存在)......

但你不能(轻易地)声明你只想向文件写入,如果它仍然和你读它时一样。

一种防御机制是利用这种机制制作一个'锁'文件,如果已经存在,则直接中止程序(因为这意味着程序的另一个副本正在运行)。

假设你不想走得太远,也不介意两个进程互相覆盖的奇特情况,你可以把事情做得相当简单。

我还是会使用新的API,它有更多的功能,并且做了更好的错误报告。

下面是一些示例代码。

public class ScorePersistence {
    private final Path root = Paths.get("/path/to/whereever/you/wanna/save/this");

    /**
     * Reads the current score; returns 0 if there isn't a score saved yet.
     */
    public int read() {
        try {
            String scoreLine = Files.readString(root.resolve("score.txt"));
            return Integer.parseInt(scoreLine);
        } catch (NoSuchFileException e) {
            return 0;
        } catch (IOException e) {
            throw new RuntimeException("I/O error reading score file", e);
        }
    }

    /**
     * Writes the provided score, overwriting any score already saved.
     */
    public void write(int score) {
        try {
            Files.createDirectories(root);
            Files.writeString(root.resolve("score.txt", "" + score));
        } catch (IOException e) {
            throw new RuntimeException("I/O error reading score file", e);
        }
    }

    /**
     * Computes the higher of the saved score and the provided score, persists it, and returns it.
     */
    public int highest(int score) {
        int existing = read();
        if (existing >= score) return existing;
        write(score);
        return score;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.