Java登录代码从文件中读取多行不起作用

时间:2015-04-06 10:24:21

标签: java

我在下面的代码中做了一个简单的密码(哈希)检查功能。但我遇到了一个问题,代码似乎只适用于文件中的单行数据,检查适用于Line1但不适用于Line2,我不确定是什么问题。数据如下所示

结果应该是hashedP匹配Line1或2.但它最终只匹配Line1

260670134225f2a24b59121739fec73584b0ddb6b49c39e31bd1df5483ac144d //Line1
cf80cd8aed482d5d1527d7dc72fceff84e6326592848447d2dc0b0e87dfc9a90 //Line2

代码:

public static void LoginMenu() {
    System.out.println("Please Enter Your Password: ");
    Scanner UserPass = new Scanner(System.in);
    String UserP = UserPass.nextLine();
    String hashedP = Utility.getHash(UserP);

    File file = new File("admin.dat");
    try {
        Scanner scanner = new Scanner(file);
        while (scanner.hasNextLine()) {
            String fileline = scanner.nextLine();
            if (!(fileline.equals(hashedP))) {
                System.out.println("Login Failed!");
                LoginMenu();
            }
            else {
                System.out.println("Login Successful.\n");
                AdminMenu();
            }
        }
        scanner.close();
    }
    catch (FileNotFoundException exc) {
        exc.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:2)

让我们分析一下这个部分:

while (scanner.hasNextLine()) {
    String fileline = scanner.nextLine();
    if (!(fileline.equals(hashedP))) {
        System.out.println("Login Failed!");
        LoginMenu();
    }
    else {
        System.out.println("Login Successful.\n");
        AdminMenu();
    }
}
  1. 我们输入while循环。
  2. 我们从文件中读到第一行。
  3. 我们会针对hashedP进行检查 3.1。如果匹配,我们会显示管理界面 3.2。如果不匹配,我们会提示用户再次登录。
  4. 你甚至没有到达文件中的第二行,它失败得太快 你应该重构你的循环以更加努力:

    boolean failed = true;
    while (scanner.hasNextLine())
    {
        String fileline = scanner.nextLine();
        if (fileline.equals(hashedP))
        {
            failed = false;
            System.out.println("Login Successful.\n");
            AdminMenu();
        }
    }
    if(failed)
    {
        System.out.println("Login Failed!");
        LoginMenu();
    }
    

    与此无关,如果以任何方式可以避免,那么永远不会以递归方式调用函数。 在这种情况下,例如,admin.dat和新的stdin扫描仪将在输入错误密码时打开多次,设计不当。
    我建议使用while(true)循环来读取密码并在此之前执行其他所有操作:

    public static void LoginMenu()
    {
        ArrayList<String> hashes = new ArrayList<String>();
        File file = new File("admin.dat");
        try
        {
            Scanner scanner = new Scanner(file);
            while (scanner.hasNextLine())
            {
                hashes.add(scanner.nextLine());
            }
            scanner.close();
        }
        catch (FileNotFoundException exc)
        {
            exc.printStackTrace();
            return;
        }
        Scanner UserPass = new Scanner(System.in);
        while (true)
        {
            System.out.println("Please Enter Your Password: ");
            String UserP = UserPass.nextLine();
            String hashedP = Utility.getHash(UserP);
            if (hashes.contains(hashedP))
            {
                System.out.println("Login Successful.\n");
                AdminMenu();
                break;
            }
            System.out.println("Login Failed!");
        }
    }