更新文本文件中的旧行

时间:2015-05-07 10:36:38

标签: java java.util.scanner

好的,所以我在尝试更新文本文件中的行或句子时遇到问题。

我的程序的工作方式是:如果用户输入问题,程序会在文本文件中搜索该确切的问题(假设是n)。问题的答案将在以下行(n + 1)。我的问题是尝试将以下行(n + 1)更新为用户输入的新行。

当我尝试更新文本文件中的行时,我一直收到Exception in thread "main" java.util.NoSuchElementException: No line found。我的removedata()是我尝试更新文本行的地方。

这是我的代码

public static void removedata(String s) throws IOException {

    File f = new File("data.txt");
    File f1 = new File("data2.txt");
    BufferedReader input = new BufferedReader(new InputStreamReader(
            System.in));
    BufferedReader br = new BufferedReader(new FileReader(f));
    PrintWriter pr = new PrintWriter(f1);
    String line;

    while ((line = br.readLine()) != null) {
        if (line.contains(s)) {

            System.out.println("Enter new Text :");
            String newText = input.readLine();
            line = newText;
            System.out.println("Thank you, Have a good Day!");

        }

        pr.println(line);
    }
    br.close();
    pr.close();
    input.close();
    Files.move(f1.toPath(), f.toPath(), StandardCopyOption.REPLACE_EXISTING);

}

public static void parseFile(String s) throws IOException {

    File file = new File("data.txt");
    Scanner scanner = new Scanner(file);
    Scanner forget = new Scanner(System.in);
    while (scanner.hasNextLine()) {
        final String lineFromFile = scanner.nextLine();
        if (lineFromFile.contains(s)) {
            System.out.println(scanner.nextLine());

            System.out
                    .println(" Would you like to update this information ? ");
            String yellow = forget.nextLine();
            if (yellow.equals("yes")) {
                removedata(scanner.nextLine()); // NoSuchElementException
                                                // error
            } else if (yellow.equals("no")) {

                System.out.println("Have a good day");
                // break;
            }

        }
    }
}

public static void getinput() throws IOException {

    Scanner scanner = new Scanner(System.in);
    String input = null;
    /* End Initialization */
    System.out.println("Welcome ");
    System.out.println("What would you like to know?");

    System.out.print("> ");
    input = scanner.nextLine().toLowerCase();
    parseFile(input);
}

public static void main(String args[]) throws ParseException, IOException {
    /* Initialization */
    getinput();

}

我的文字文件是:

           what is the textbook name?
           the textbook name is Java
           how is the major?
           the major is difficult
           how much did the shoes cost?
           the shoes cost ten dollars 

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

问题在于:

while (scanner.hasNextLine()) {                         //(1)
        final String lineFromFile = scanner.nextLine(); //(2)
        if (lineFromFile.contains(s)) {                 //(3)
            System.out.println(scanner.nextLine());     //(4)
        //....
            String yellow = forget.nextLine();          //(5)
            if (yellow.equals("yes")) {
                removedata(scanner.nextLine());         //(6)
            }
        }
//....
}

首先,您正在迭代扫描仪行,检查是否有行(1)。现在,您将在(2)上获得扫描仪的第一行,但如果条件(3)成功,则您将在{4}内的{4}处再次检索下一行行。同样适用于(5)和(6)。

现在,假设您已经到达文件末尾(2)并且条件(3)成功。您将收到逻辑上没有此类行的例外情况。在(5)和(6)也可能发生同样的情况。

System.out.println(....)的每次调用都会在流上打开文件的下一行。

我建议您在循环中执行一个读取行,然后在需要时应用收到的字符串。

答案 1 :(得分:1)

parsefile 中的 if block 中的代码更改为

String temp = scanner.nextLine();
System.out.println(temp);

System.out
        .println(" Would you like to update this information ? ");
String yellow = forget.nextLine();
if (yellow.equals("yes")) {
    removedata(temp); // NoSuchElementException
                                    // error
} else if (yellow.equals("no")) {

    System.out.println("Have a good day");
    // break;
}

要解释为什么会这样,请看Nick L.的答案。