从 Java 中的文件中扫描字符串时遇到问题

Having problems scanning a String from a file in Java

我正在尝试扫描 .txt 文件中的一行文本,将其分成七个数字,更改其中两个数字,然后将新数字写回到 .txt 文件中。下面的代码第一次工作正常,但似乎在第二次从文本文件读取新的起始字符串时出现问题。我已经多次完成非常相似的事情并且没有任何问题,所以我真的不确定为什么这次会遇到问题。我目前的代码是:

public void addWin(int numGuesses) throws IOException {
    FileWriter writer = new FileWriter(*filepath*);
    Scanner scan = new Scanner(new File(*filepath*));
    String temp = "0;0;0;0;0;0;0;";
    if (scan.hasNextLine()) {
        temp = scan.nextLine();
    }
    String[] statsArr = temp.split(";");
    scan.close();
    statsArr[0] = Integer.toString(Integer.parseInt(statsArr[0]) + 1);
    statsArr[numGuesses] = Integer.toString(Integer.parseInt(statsArr[numGuesses]) + 1);
    for (int i = 0; i < statsArr.length; i++) {
        writer.append(statsArr[i] + ";");
    }
    writer.close();
}

一些额外的上下文(如果需要),这基本上是针对我拥有的 Discord 机器人的 Wordle 克隆之类的东西。 numGuesses 是猜对单词的次数。写入和读取的字符串是由分号分隔的 7 个数字,第一个数字是当前的连胜记录,第二个数字是您在 1 次猜测中获胜的次数,依此类推。我所做的测试似乎在扫描仪关闭之前将错误放在了某个地方。第一个 运行 通过将正确写入数字,因此如果在 3 次尝试中猜出单词,文件将包含“1;0;0;1;0;0;0;”,但下一次方法被称为它本质上是从头开始。在第二个 运行 的 if 语句之后检查 temp 变量,只显示“0;0;0;0;0;0;0;”。抱歉啰嗦,只是想提供所有可能有用的细节。提前致谢!

-

考虑 JavaDoc,它指出“文件是否可用或是否可以创建取决于底层平台。”。所以这里发生的事情是,当你使用 new FileWriter(*filepath*) 时,文件是 locked/created 空白,所以当你使用 new Scanner(new File(*filepath*));scan.hasNextLine() 时,你会得到一个 null/empty值。

简单的解决方案是将 FileWriter 在代码中进一步向下移动,并且仅在扫描仪关闭后才打开它。还要在您的 if 语句中添加一个 else,以便您知道从扫描仪读取是否存在问题:

//Move the below line to be later in the code
//FileWriter writer = new FileWriter(*filepath*);
Scanner scan = new Scanner(new File(*filepath*));
String temp = "0;0;0;0;0;0;0;";
if (scan.hasNextLine()) {
    temp = scan.nextLine();
}
//Add some debugging
else{
    System.out.println("ERROR no data could be read");
}
String[] statsArr = temp.split(";");
scan.close();
statsArr[0] = Integer.toString(Integer.parseInt(statsArr[0]) + 1);
statsArr[numGuesses] = Integer.toString(Integer.parseInt(statsArr[numGuesses]) + 1);

//Create the flie writer here instead
FileWriter writer = new FileWriter(*filepath*);
for (int i = 0; i < statsArr.length; i++) {
    writer.append(statsArr[i] + ";");
}
writer.close();

现在假设文件存在并且可以编辑,并且numGuesses = 3,然后对于以下内容:

1;2;3;4;5;6;7;

运行 代码的输出符合预期(+1 到 0 和第 3 个索引)

2;2;3;5;5;6;7;

您只看到 0;0;0;0;0;0;0; 的原因是因为代码无法从扫描仪读取,并且始终使用此行 String temp = "0;0;0;0;0;0;0;"; 中的临时值。通过添加上面的 else 检查,我们可以看到它何时失败。

FileWriter writer = new FileWriter(*filepath*); 清除您尝试读取的文件的内容。您需要在 scan.close();

之后移动此行