从 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();
之后移动此行
我正在尝试扫描 .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();