在我正在处理的游戏中,我有String
显示分数,问题是代码将String
保存到文件中。我不想保存得分,因为比赛会在你玩游戏时更新。因此我从这样的摇摆计时器运行该方法。
Timer timer = new Timer(1, new ActionListener(){
public void actionPerformed(ActionEvent e){
save();
}
});
timer.start();
save方法看起来像这样,它应该可以工作,因为我已经使用了我之前制作的文本程序完全相同的代码。
public void save(){
try{
getScore = new File("Score.dat");
scoreFile = new FileOutputStream(getScore);
byte[] saveScore = score.getBytes();
scoreFile.write(saveScore);
scoreFile.close();
}catch(FileNotFoundException ex){
}catch(IOException ex){
}
}
我在游戏New Game
和Continue
的起始屏幕中有两个按钮。我已经这样做,如果你按New Game
,文件会将其文本更新为0,如果按Continue
,代码将正常进行,分数将等于文件中显示的内容。这是两个按钮的ActionListener
。
public void actionPerformed(ActionEvent e){
Object command = e.getSource();
if(command.equals(newGame)){
try{
PrintWriter pw = new PrintWriter(new File("Score.dat"));
pw.print("0");
pw.close();
}catch (FileNotFoundException ex){
}
startGame = true;
}
if(command.equals(contGame)){
startGame = true;
}
}
文件是正常创建的,我没有得到任何错误,但文件没有更新,它内部始终为0。我曾尝试使用PrintWriter
而不是FileOutputStream
,因为它适用于将文件的文本设置为0,但当我将其与pw.print(score);
一起使用时,我的文件资源管理器崩溃,我必须重新启动我的计算机。
修改
我已经弄清楚问题是什么,但我不知道如何解决它。当我打印出分数时,结果将如下:0,0,0,0,10,0,0,0,0,20,0,0,0,30(如果文件内的数字是0,如果它是50,你将用50)替换所有的0,依此类推。
因此,您看到该文件只有25%的可能性来更新分数。我不知道为什么会发生这种情况,因为我在代码中看不到可能导致此问题的任何地方。
这是加载分数的代码。
public void load(){
try{
br = new BufferedReader(new FileReader("Score.dat"));
score = br.readLine();
}catch (FileNotFoundException ex){
}catch(IOException ex){
}
}
此方法在load();
方法中public Player()
Player
运行一次({{1}}是该类的名称)。
答案 0 :(得分:0)
我讨厌建议这一点,但您确定score
方法中的save()
变量是非零吗?您可以考虑在其中放置一行来打印score
的值以进行调试,或者检查调试器中的值。这种方法没有明显的错误,它可以在没有flush()
的情况下工作,因为PrintWriter
将close()
Writer
中的{{1}}自动清除。
正如反斜杠所说,你可能想要增加计时器的睡眠时间,一毫秒真的很短。
答案 1 :(得分:0)
您可能遇到同步问题。制作一个获取分数并将其写入文件的方法。在新游戏,继续,关闭窗口(如果它是一个java框架)和计时器中调用此方法。但要使计时器至少250毫秒
synchronized void save(int score) {
PrintWriter pw = null;//any resource with IO should be in a finally block to close
try {
pw = new PrintWriter(new File("Score.dat"));
pw.print("" + score);
pw.close();
} catch (Exception ex) {
System.out.println("save err " + ex);
ex.printStackTrace();
// or better get a logger
// logger.log(Level.WARNING,"save err " + ex ,ex);
}finally{
if (pw != null) {
try {
pw.close();
} catch (Throwable e) {
logger.log(Level.FINER, "err close :pw" , e);
}
}
}
}
编辑:最好将得分变量保存为int或long,编辑代码以便相应地阅读