Java:将字符串保存到文件

时间:2013-05-01 16:15:42

标签: java string file save actionlistener

在我正在处理的游戏中,我有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 GameContinue的起始屏幕中有两个按钮。我已经这样做,如果你按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}}是该类的名称)。

2 个答案:

答案 0 :(得分:0)

我讨厌建议这一点,但您确定score方法中的save()变量是非零吗?您可以考虑在其中放置一行来打印score的值以进行调试,或者检查调试器中的值。这种方法没有明显的错误,它可以在没有flush()的情况下工作,因为PrintWriterclose() 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,编辑代码以便相应地阅读