读/写txt文件进行保存

时间:2015-10-22 21:14:01

标签: java file save lwjgl slick2d

我现在已经在gameover上将高分写入文本文件,并在游戏加载时阅读它们。我现在的问题是在任何地方找不到txt文件highscores.txt,因为我还没有创建它。是否可以在找不到文件时创建文件?以下是相关代码:

在gameover上将高分数写入文件:

if(gameOver == true){
        sbg.enterState(5, new FadeOutTransition(), new FadeInTransition());
        if(score > Highscores.highscore3 && score < Highscores.highscore2){
            Highscores.highscore3 = score;
        }else if(score > Highscores.highscore2 && score < Highscores.highscore1){
            Highscores.highscore3 = Highscores.highscore2;
            Highscores.highscore2 = score;  
        }else if(score > Highscores.highscore1){
            Highscores.highscore3 = Highscores.highscore2;
            Highscores.highscore2 = Highscores.highscore1;
            Highscores.highscore1 = score;
        }else Highscores.highscore1 = score;

        //Write highscores to highscores.txt
        try{
            PrintWriter writer = new PrintWriter("highscores.txt", "UTF-8");
            writer.println(String.valueOf(Highscores.highscore1));
            writer.println(String.valueOf(Highscores.highscore1));
            writer.println(String.valueOf(Highscores.highscore1));
            writer.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        gameOver = false;
        gameStart = false;
    }

在程序开始时从highscores.txt读取高分:

public static void main(String[] args) throws IOException{

    BufferedReader in = new BufferedReader(new FileReader("highscores.txt"));
    String line;

    while((line = in.readLine()) != null){
        System.out.println(line);
    }
    in.close();

我知道如果文件不存在,我可以创建一个文件:

try{
File save = new File("highscores.txt");
if (!save.exists()){
    save.createNewFile();
System.out.println("\n----------------------------------");
System.out.println("The file has been created.");
System.out.println("------------------------------------");
}

但我不知道如何使用缓冲区。请帮忙!

3 个答案:

答案 0 :(得分:1)

让我先说一下我不熟悉在文件系统上存储游戏相关信息的最佳实践。话虽这么说,听起来你正在努力学习这个,所以考虑到这一点,我建议开始写一个简单的.txt文件。

基本上可以在SO上找到:

如何创建和写入txt文件: How do I create a file and write to it in Java?
如何从txt文件中读取: Reading and displaying data from a .txt file
以及适合衡量的Java教程:https://docs.oracle.com/javase/tutorial/essential/io/file.html

我会做的是:
1。找出你想要触发写入的时间。
您想什么时候更新您的高分文件?对我来说,看起来这将是你的游戏玩法类在158左右,在那里你确定游戏已经结束:

//Change to GameOverEasy state if gameOver is true
            if(gameOver == true){


2。弄清楚何时需要读入文件以填充Highscores。在你的代码中使用pastebin,在你开始加载游戏状态/循环之前,对我来说这似乎是你想要在你的Blop类的main方法启动时做的事情:

        public static void main(String[] args) throws IOException{

            AppGameContainer appgc;
            try{
                    appgc = new AppGameContainer(new Blop(NAME));

                    //Window size
                    appgc.setDisplayMode(960, 640, false);
                    appgc.setShowFPS(false);
                    appgc.setAlwaysRender(true);
                    appgc.setTargetFrameRate(60);
                    appgc.setVSync(true);
                    Display.setIcon(new ByteBuffer[] {
                new ImageIOImageData().imageToByteBuffer(ImageIO.read(new File("res/images/general/Icon16.png")), false, false, null),
                new ImageIOImageData().imageToByteBuffer(ImageIO.read(new File("res/images/general/Icon32.png")), false, false, null)
                });

//TODO: Read in high scores file and populate Highscores class

                    appgc.start();
            }catch(SlickException e){
                    e.printStackTrace();
            }


3。弄清楚如何格式化文本文件。您已经订购了分数,因此您也可以将它们存储起来。每行保存一个分数或使用“,”或“|”之类的分隔符可以使用你现在拥有的东西。


从简单的文本文件开始,如果符合您的需要,请更改为其他内容。如果这是一个测试/学习项目,我强烈建议你保持简单并坚持使用一个简单的.txt文件,直到你把它包裹起来更多

要记住的一些事项:

  1. 您将遇到很多异常处理。在阅读该文件时,您需要确定您的游戏是否因为无法加载高分文件而无法启动?另一方面,当你没有写入该文件时,这是一个严重的错误吗?
  2. Always be closing
  3. 编辑: 关于您的后续问题,您希望使用您正在使用的文件的实际名称。 Javadocs are your friend。关于你的第二个问题,请查看一些other SO posts。这很好。

答案 1 :(得分:0)

让文件编写者在程序关闭之前将这些值写入.txt文件,然后读取文件读取器并将这些值加载到高分实例变量中。这不是真正的火箭科学。

答案 2 :(得分:0)

一切正常,这里是如何在游戏结束时保存高分,以及如何在程序启动时加载它们。

当第一次启动程序时,它会检查是否有一个名为highscores.txt的文件,如果没有,它会在文件中创建一个并放置3个ZEROS,这样你才能获得文件的异常太空了!:

//Read highscores from highscores.txt
    File save = new File("highscores.txt");
    if (!save.exists()){
        save.createNewFile();
        System.out.println("\n----------------------------------");
        System.out.println("The file has been created.");
        System.out.println("------------------------------------");
        //Places the default 0 values in the file for the high scores
        PrintWriter writer = new PrintWriter("highscores.txt", "UTF-8");
        writer.println(String.valueOf(0));
        writer.println(String.valueOf(0));
        writer.println(String.valueOf(0));
        writer.close();
    }

当您玩游戏几次时,当游戏处于“gameover”状态时,高分将写在highscores.txt文件中:

//Write highscores to highscores.txt
        try{
            PrintWriter writer = new PrintWriter("highscores.txt", "UTF-8");
            writer.println(String.valueOf(Highscores.highscore1));
            writer.println(String.valueOf(Highscores.highscore2));
            writer.println(String.valueOf(Highscores.highscore3));
            writer.close();
        }catch(Exception e){
            e.printStackTrace();
        }

最后,当你关闭程序时,highscore1,highscore2和highscore3的最后一个值被写在highscores.txt文件中。因此,当您启动该程序时,您希望从该文件中读取这些整数。由于文件包含字符串,我想要整数,我必须以字符串的形式从文件中获取行,将其转换为整数,然后将其分配给变量Highscores.highscore1 ... (这是在“文件检查器”下的if()语句)

//Read string values of high score and convert to int to put into variables
    BufferedReader in = new BufferedReader(new FileReader("highscores.txt"));
    String line;
    line = in.readLine();
    Highscores.highscore1 = Integer.parseInt(line);
    line = in.readLine();
    Highscores.highscore2 = Integer.parseInt(line);
    line = in.readLine();
    Highscores.highscore3 = Integer.parseInt(line);

    in.close();

因此,当您再次打开程序时,highscores.txt文件中写入的最后一个值将被放入您的高分整数。这就是你拯救他们的方式!