使用while()循环检查元素的.txt文件

时间:2015-11-14 21:39:22

标签: java arrays file while-loop

我正在编写一个程序,要求用户登录并检查他们的ID是否在文件中" Employees.txt"如果是,那么如果他们是经理或助理,它将打印出VALID __ ID。但是当我输入一个无效的ID时,请说" x" in然后再试一次,它会永远循环,而不是检查ID是否有效。我该如何解决这个问题?我在与Account.java和

相同的目录中有Employees.txt
def digitCount(n):
    if len(str(n)) == 1:
        return 1
    else:
        return 1 + digitCount(str(n)[1:])

是文件里面的内容。任何帮助都会受到赞赏,因为我已尽力而为。感谢。

E12,Manager
E13,Assistant

3 个答案:

答案 0 :(得分:2)

当您输入ID时,您开始循环文件以查看该ID是否匹配。

您到达文件的末尾。 readEmployeesFile.hasNextLine()是假的。所以你再次迭代,阅读下一个ID。

但是readEmployeesFile仍然在文件的末尾。没有什么可以把它带回到开头。因此,当它再次转到while时,readEmployeesFile.hasNextLine() 仍然为假。

可能的解决方案:

  • 打开扫描仪readEmployeesFile,而不是在方法的开头,而是在使用之前。然后在到达文件末尾后立即关闭它。因此,每次用户输入ID时,您都会打开和关闭它。
  • 在开始提示用户之前,将文件中的所有ID读入Map,然后在该地图中而不是直接在文件中查找ID。这会更有效率。

答案 1 :(得分:1)

问题是您在循环内打开Scanner,强制它在第一次迭代时读取文件的所有内容。这意味着while(readEmployeesFile.hasNextLine())中的条件在第一次迭代后将始终计算为false,并且永远不会再次输入循环。因此,只有第一次试验可能有效,之后您的循环无法终止。

以下是适合我的调整代码:

import java.io.*;
import java.util.*;
public class Account
{
    public static String  accountInput;
    public static boolean inSystem      = true;
    public static boolean displayLogIn  = true;
    public static Scanner userInput     = new Scanner(System.in);
    public static File employeesFile    = new File("Employees.txt");
    public static void main(String[] args) throws IOException
    {
        List<String[]> contents = new ArrayList<>();
        System.out.println("\tWorking Files");
        System.out.println("-------------------------------------------");
        System.out.println("Stock File:\t\tStock.txt\nEmployee File:\t\tEmployees.txt\nTransactions File:\tTransactions.txt\n\n");
        Scanner readEmployeesFile = new Scanner(employeesFile);
        while(readEmployeesFile.hasNextLine()) {
            String[] current = readEmployeesFile.nextLine().split(",");
            contents.add(current);
        }
        while(inSystem)
        {
            while(displayLogIn)
            {
                System.out.print("Enter Employee ID(i.e E1)\tEnter Q to Quit Program.\nEnter here: ");
                accountInput = userInput.nextLine();

                for(String[] content: contents) {
                    if (content[0].equals(accountInput) & content[1].equals("Manager")) {
                        displayLogIn = false;
                        System.out.print("Valid MGR ID");
                        inSystem = false;
                    } else if (content[0].equals(accountInput) & content[1].equals("Assistant")) {
                        displayLogIn = false;
                        System.out.print("Valid AST ID");
                        inSystem = false;
                    } else if (accountInput.equals("Q")) {
                        displayLogIn = false;
                        inSystem = false;
                    }
                }
            }
        }
        readEmployeesFile.close();
    }
}

正如您所看到的,输入文件在之前读取一次进入循环并存储contents中现在为List<String[]>类型的所有行。在for循环中,您只需要检查已经读取的文件的内容。

另外,您应该始终关闭正在使用的资源。在这种情况下,我引用Scanner对象,这就是我在循环后包含行readEmployeesFile.close();的原因。

答案 2 :(得分:0)

更改

contents[0].equals(accountInput) & contents[1].equals("Manager")
contents[0].equals(accountInput) & contents[1].equals("Assistant")

contents[0].equals(accountInput) && contents[1].equals("Manager")
contents[0].equals(accountInput) && contents[1].equals("Assistant")

AND 运算符用双符号(&amp;&amp;)表示,而不是一个。