Java:将字符串保存到文件
Posted
技术标签:
【中文标题】Java:将字符串保存到文件【英文标题】:Java: Saving a String to a file 【发布时间】:2013-05-01 16:15:41 【问题描述】:在我正在开发的游戏中,我有一个显示分数的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, 0, 30(如果文件内的数字是0,如果是 50,则将所有 0 替换为 50) 等等。
如您所见,文件更新分数的机会只有 25%。我不知道为什么会发生这种情况,因为我在我的代码中看不到任何可能导致这种情况的地方。
这是加载分数的代码。
public void load()
try
br = new BufferedReader(new FileReader("Score.dat"));
score = br.readLine();
catch (FileNotFoundException ex)
catch(IOException ex)
通过在public Player()
方法中添加load();
运行该方法一次(Player
是类的名称)。
【问题讨论】:
你试过flush()流吗? 我实际上会在这里打印抛出/捕获的异常: catch(FileNotFoundException ex) catch(IOException ex) 您想每 1 毫秒保存一次文件吗?你还好吗?!?每次你的分数改变时保存文件,每 1 毫秒保存一个文件是没有意义的! @BrianAgnew 我已经这样做了,但没有打印任何内容,因为从不抛出异常 您是否确保在开始新游戏之前和玩了一段时间之后检查文件中的内容。我问是因为当你继续时,我在任何地方都看不到你将比分读回到游戏中。 【参考方案1】:我不想建议这个,但你确定你的score
变量在save()
方法中是非零的吗?您可能会考虑在其中放置一行以打印 score
的值以进行调试,或者检查调试器中的值。这种方法没有明显的问题,并且在没有flush()
的情况下也可以工作,因为PrintWriter
将自动刷新close()
,如Writer
中定义的那样。
正如反斜杠所指出的,您可能想增加计时器的睡眠时间,一毫秒真的很短。
【讨论】:
当我打印出分数时,结果如下: 得分:0 得分:0 得分:0 得分:0 得分:0 得分:0 得分:0 得分:0 得分:0 得分:0 得分:0 得分:0 得分:0 得分:0评分:0 评分:0 评分:0 评分:0 评分:0 评分:0 评分:10 评分:0 评分:0 评分:0 评分:0 评分:20 评分:0 评分:0 评分:0 评分:0 评分: 40 得分:0 得分:0 得分:0 得分:0 得分:40 得分:0 得分:0 得分:0 为什么我射击敌人的分数是0。当我射击一个敌人时,分数应该会上升 10,所以当我射击一个敌人时它似乎只会是 10,然后在我射击另一个敌人之前是 0 我敢打赌,在游戏循环的某些部分,您无意中将 score 值改写为 0。如果您使用的是 Eclipse,您可以右键单击 score 变量并选择“显示引用”,它应该会在您引用此变量的任何地方显示您。如果有的话,您可能还想检查它的 setter 方法。 我没有在我的代码中看到将分数设置为 0 的任何地方,但我现在看到每 10、20、30 之间恰好有 4 个 0 ......所以它可能必须这样做在我的游戏中使用摇摆计时器【参考方案2】:您可能遇到了同步问题。只制作一种获取分数并将其写入文件的方法。在新游戏上调用此方法,继续,关闭窗口(如果它是 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);
编辑:最好将你的分数 var 保持为 int 或 long,编辑你的代码以便相应地阅读
【讨论】:
以上是关于Java:将字符串保存到文件的主要内容,如果未能解决你的问题,请参考以下文章