如何在.txt文件中搜索字符串和哈希码? (Java)

时间:2019-03-17 15:25:43

标签: java java.util.scanner bufferedreader equals readfile

提示:我正在编写一个登录程序,询问用户其用户名和密码。所有用户信息都存储在password.txt文件中,而密码则存储为哈希码。如果用户输入的无效用户名或密码与条目中的哈希值不具有相同的哈希值,则程序应打印“ Unsuccessful login”。如果用户输入有效的用户名且密码具有与哈希值相同的哈希值项中的哈希值,则程序应显示“登录成功”。

password.txt文件的设置如下:

Real name:username:password_hash

问题:如何在.txt中搜索字符串和哈希码?

这是我现在拥有的代码:

   public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            Scanner sf = new Scanner("passwords.txt");
            String Username;
            String Password;

            System.out.println("Login ");
            System.out.println("Please Enter Username: ");
            Username = sc.next();

            System.out.println("Please Enter Password: ");
            Password = sc.next();

            String login = Username + ":" + Password.hashCode();
            System.out.println(login);

            while(sf.hasNextLine()){
                    if((login.equals(sf.nextLine().trim()))){
                            System.out.println("Login Successful!");
                            break;
                    }

                    if(!(login.equals(sf.nextLine().trim()))){
                            System.out.println("Login Unsuccessful!");

                    }
            }

我正在尝试在代码中搜索类似于用户名的字符串:hashcodePassword

问题:如果if语句也不打印代码,则在运行程序时出现此错误

错误:

Exception in thread "main" java.util.NoSuchElementException: No line found
        at java.util.Scanner.nextLine(Scanner.java:1540)
        at LoginApplication.main(LoginApplication.java:29)

1 个答案:

答案 0 :(得分:1)

简单的解释:您的代码检查文件是否有下一行,因此它检查第一个嵌套的 if ,但此处它从文件中读取一行并将指向文件的指针移至下一行。然后,它检查下一个 if语句,并在此处读取文件的另一行。 出现问题是因为您实际上一次读取两行文件。

解决方案是

while(sf.hasNextLine()) {
                final String currentLine = sf.nextLine().trim();
                if(login.equals(currentLine)){
                        System.out.println("Login Successful!");
                        break;
                } else {
                        System.out.println("Login Unsuccessful!");
                }
        }

然后,如果需要更多if语句,则可以使用 currentLine 变量,而不是读取文件的另一行。