所以我创建了一个游戏,其中包括一个分数指示器,可以在gui屏幕的右上角显示分数,也可以在输赢屏幕中显示。
现在,我想创建一个txt文件,将存储最高的分数,曾经达到的。这意味着。
这个文件将只包括一行,内容如下: 到目前为止,最高分是。三十.
我试图阅读JAVA io,但我迷失了方向,因为我有太多的类,我的工作.我的意思是我有mainGame类通过创建一个关卡名称列表来运行整个操作,然后将该列表发送到一个名为GameFlow的类,该类将对该列表进行循环运行,并为每个关卡运行一个动画。
所以我想在mainGame中创建一个新的txt文件,然后在GameFlow的关卡循环结束时(这意味着游戏结束),将最终的分数发送到一个新的类,我称之为 "HighScores "或其他什么的,它将获得我在mainGame中创建的文件和GameFlow中的分数,并通过比较该文件中已有的分数来更新txt文件。
但我迷路了...
我很高兴能得到一些帮助.我在想也许在把高分值写入文件之前,先把它放到一个临时的int变量中,这样我就能在每次我想比较的时候用它来比较.谢谢。
在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;
}
}