尽管在while循环中有条件,扫描仪输入仍会附加到文本文件中

时间:2013-11-15 16:54:24

标签: java terminal filewriter

我有一个小的Java应用程序,在终端执行时,将采用字符串输入,并将这些字符串保存到文本文件中。我有字符串exit,它会提示应用程序退出。但是,出于某种原因,尽管有exit循环,但字符串while(!)会附加到文档中。可能是什么问题?

try{
            Scanner scanner = new Scanner(System.in);
            String input = null;
            while(!"exit".equalsIgnoreCase(input)){
                input = scanner.nextLine();
                String fileLocation = "/Users/myName/Dropbox/myDocument.txt";
                FileWriter writer = new FileWriter(fileLocation,true);

                writer.append(returnDate()+": ");
                writer.append(input + "\n");

                writer.flush();
                writer.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }

1 个答案:

答案 0 :(得分:2)

在心理上遵守您的准则。你在循环中进行所有处理,之前下一次评估while循环条件。

你有:

while(!"exit".equalsIgnoreCase(input)){
    input = scanner.nextLine(); 
    ...
    writer.append(input + "\n");
    ...
}

假设用户键入“exit”作为第一个命令,则流程为:

  1. input最初为null
  2. while条件成功。
  3. input被读取,现在是“退出”。
  4. input,即“退出”,写入档案。
  5. while循环重启,条件被评估,失败,循环不再执行。
  6. 请注意,“exit”已写入文件。

    您必须稍微修改一下逻辑,以确保不会发生文件写入。这不是一种罕见的情况。根据您的偏好,有许多解决方案。您可以将赋值和比较组合到while语句中:

    while (!"exit".equalsIgnoreCase(input = scanner.nextLine())) {
        write input;
    }
    

    您可以进行冗余检查(对于您的简单示例没有意义,并且经常表明整体逻辑改进的空间):

    while (input is not exit) { 
        read input;
        if (input is not exit) write input;
    }
    

    根本无法使用循环条件:

    while (true) {
        read input; 
        if (input is exit) break;
        write input;
    }
    

    有很多方法可以解决它。