无法替换文本文件中的字符串

时间:2017-04-03 12:05:20

标签: java

遵循此thread

我有一个文本文件,用于存储该用户的用户名密码和bestscore。

尝试制作简单的问答游戏。我有一个注册面板,当用户注册时,我将数据存储在此文件中,并为新用户创建最佳分数0。

每一行的文本文件格式为

  

{username} {password} {bestScore}

当用户获得超过他的最佳分数时,我会尝试用bestScore替换文本文件中的实际分数。

好吧,回到那个帖子。我做了@meriton发布的所有内容,但文本文件仍然没有改变。这是我的代码:

if (gameData.getBestScore() < gameData.getScore()) {
            int oldBestScore = gameData.getBestScore();
            String oldLine = gameData.getCurrentUser() + " " + gameData.getCurrentUserPassword() + " " + oldBestScore;
            gameData.setBestScore(gameData.getScore());
            String newLine = gameData.getCurrentUser() + " " + gameData.getCurrentUserPassword() + " " + gameData.getBestScore();

            // TODO replace the points in the text file
            //first method
            /*try(BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("C:\\Users\\Niki\\Desktop\\Java Projects\\QuizGame\\QuizGame\\usernames.txt"))))) {
                String line = br.readLine();

                while (line != null) {
                    if (line.contains(gameData.getCurrentUser())) {
                        String newLine = gameData.getCurrentUser() + " " + gameData.getCurrentUserPassword() + " " + gameData.getBestScore();
                        line = line.replace(line, newLine);
                        break;
                    }
                    line = br.readLine();
                }

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/

            //second method
            Path path = Paths.get("C:\\Users\\Niki\\Desktop\\Java Projects\\QuizGame\\QuizGame\\usernames.txt");
            Charset charset = StandardCharsets.UTF_8;


            String content = null;
            try {
                content = new String(Files.readAllBytes(path), charset);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(content);
            content = content.replaceAll(oldLine, newLine);
            System.out.println(content);

            gameOverPanel.gameOverLabel.setText("<html><h1>You didn't answer correctly!</h1><hr><h2>The correct answer is: " + gameData.getCurrentQuestion().getCorrectAnswer().getText() + "</h2><h3>Congratulations! New High Score: " + gameData.getBestScore() + "</h3></html>");
        }
        else {
            gameOverPanel.gameOverLabel.setText("<html><h1>You didn't answer correctly!</h1><hr><h2>The correct answer is: " + gameData.getCurrentQuestion().getCorrectAnswer().getText() + "</h2><h3>Your score: " + gameData.getBestScore() + "</h3></html>");
        }
    }

在编辑内容之前你可以看到我println,然后在控制台上看到,一切都很好。旧内容将替换为新内容,但文件未使用新内容进行更新。

此外,我尝试以我的方式执行此操作,您可以在//第一个方法注释下的代码中看到注释部分。那种方式仍然没有用。

2 个答案:

答案 0 :(得分:1)

下面:

System.out.println(content);
content = content.replaceAll(oldLine, newLine);
System.out.println(content);

更新内存中的String变量。就是这样。但是你的内存中的值与光盘上的文件之间没有“神奇”的联系。该字符串变量既不知道也不关心您最初从文件中读取其内容。

如果您想更新文件内容;然后你必须将更改的字符串写回你的文件。有关如何执行此操作的建议,请参阅here

答案 1 :(得分:1)

尝试将变量的内容写入源文件。

Files.write(path, content.getBytes(), StandardOpenOption.CREATE);

您刚刚在内存中加载了文件内容,并在replaceAll变量上应用了content

但您必须将更改保存到源文件中。