遵循此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
,然后在控制台上看到,一切都很好。旧内容将替换为新内容,但文件未使用新内容进行更新。
此外,我尝试以我的方式执行此操作,您可以在//第一个方法注释下的代码中看到注释部分。那种方式仍然没有用。
答案 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
。
但您必须将更改保存到源文件中。