Java 检查文本文件中的用户名和密码

Java 检查文本文件中的用户名和密码,java,swing,Java,Swing,我必须实现一个登录系统,为此,在创建帐户时,我将数据保存在一个文本文件中。数据的格式为{username}{password}{bestScore}。但是当涉及到登录,我有更多的用户。我的算法检查文本文件的每一行,如果用户存在,则转到主菜单面板。如果用户名错误,请打开joptionpane,告诉用户用户名不正确或密码相同。问题是,在所有情况下,它都会对文件的第一行执行,while循环会中断。那不是我的主意。我想在整个文本文件中检查用户名和密码是否匹配。不是文件的每一行。这是我的代码(不是我想要的

我必须实现一个登录系统,为此,在创建帐户时,我将数据保存在一个文本文件中。数据的格式为{username}{password}{bestScore}。但是当涉及到登录,我有更多的用户。我的算法检查文本文件的每一行,如果用户存在,则转到主菜单面板。如果用户名错误,请打开joptionpane,告诉用户用户名不正确或密码相同。问题是,在所有情况下,它都会对文件的第一行执行,while循环会中断。那不是我的主意。我想在整个文本文件中检查用户名和密码是否匹配。不是文件的每一行。这是我的代码(不是我想要的工作方式):


在这里您可以看到,在输入的第一行中,我将转到4种情况之一,while循环将停止。但是,如果用户名在第二行,例如,我会看到一个对话框,其中显示消息“错误的用户名”。我的想法之一是将文件中的所有内容附加到
StringBuilder
,然后使用
.contains
检查用户名和密码是否存在,但我觉得有点错误,因为如果我将用户名和密码与contains匹配,它将检查整个文本文件中的组合。例如,用户名可以在第一行,密码可以在第三行,并且会有匹配项。那不是我想要的。他们必须站在同一条线上才能进行匹配。

首先,我认为你需要准确地确定你的要求,然后,在程序中思考什么是对的,什么是错的会容易得多

我假设用户名是正确的,那么它在文件中只出现一次。如果用户名不正确,它很可能不会出现在文件中;然而,我们不能排除这样一种可能性,即如果其他人的用户名彼此有些相似,则可能有人意外输入了其他人的用户名

在以下两种情况下,
!username.equals(usernameField.getText())
您不应该做任何事情,只需继续在文件中搜索正确的用户名即可

找到正确的用户名后,您可以根据密码是否正确执行必须执行的操作。在此之后,如果您愿意,您可以中断循环,因为您知道稍后将无法在文件中再次找到用户名

最后,如果您在整个文件中都没有找到用户名,那么应该发出关于用户名不正确的消息

在代码中,类似以下内容(未测试):


哥们,这很有效。您刚刚错过了while循环中的
行=br.read()
,一切都按照我的要求运行。谢谢
private static final Pattern usernameAndPasswordPattern = Pattern.compile("^(\\S+) (\\S+) ([0-9]+)$");
loginButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            try(BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("C:\\Users\\Niki\\Desktop\\Java Projects\\QuizGame\\QuizGame\\usernames.txt"))))) {
                String line = br.readLine();

                while (line != null) {
                    Matcher userNameAndPasswordMatcher = usernameAndPasswordPattern.matcher(line);

                    if (userNameAndPasswordMatcher.matches()) {
                        String username = userNameAndPasswordMatcher.group(1);
                        String password = userNameAndPasswordMatcher.group(2);
                        String bestScore = userNameAndPasswordMatcher.group(3);

                        String pwd = new String(passField.getPassword());

                        if (username.equals(usernameField.getText()) && !password.equals(pwd)) {
                            int result = JOptionPane.showConfirmDialog(null, "Incorrect password!", "Login incomplete", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);
                            if (result == JOptionPane.OK_OPTION) {
                                passField.setText("");
                            }                           
                        }
                        else if (!username.equals(usernameField.getText()) && password.equals(pwd)) {
                            int result = JOptionPane.showConfirmDialog(null, "Incorrect username!", "Login incomplete", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);
                            if (result == JOptionPane.OK_OPTION) {
                                usernameField.setText("");
                            }
                        }
                        else if (!username.equals(usernameField.getText()) && !password.equals(pwd)) {
                            int result = JOptionPane.showConfirmDialog(null, "This account don't exist!", "Login incomplete", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);
                            if (result == JOptionPane.OK_OPTION) {
                                usernameField.setText("");
                                passField.setText("");
                            }
                        }
                        else if (username.equals(usernameField.getText()) && password.equals(pwd)) {
                            gd.setCurrentUser(username);
                            gd.setBestScore(Integer.parseInt(bestScore));

                            rdialog = new RedirectingDialog(frame);
                            rdialog.setVisible(true);
                        }
                    }
                    line = br.readLine();
                }

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    });
            boolean userNameFound = false;
            while (line != null) {
                Matcher userNameAndPasswordMatcher = usernameAndPasswordPattern.matcher(line);

                if (userNameAndPasswordMatcher.matches()) {
                    String username = userNameAndPasswordMatcher.group(1);
                    String password = userNameAndPasswordMatcher.group(2);
                    String bestScore = userNameAndPasswordMatcher.group(3);

                    String pwd = new String(passField.getPassword());

                    if (username.equals(usernameField.getText())) {
                        userNameFound = true;
                        if (password.equals(pwd)) {
                            gd.setCurrentUser(username);
                            gd.setBestScore(Integer.parseInt(bestScore));

                            rdialog = new RedirectingDialog(frame);
                            rdialog.setVisible(true);
                        } else { // password does not match
                            int result = JOptionPane.showConfirmDialog(null, "Incorrect password!", "Login incomplete", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);
                            if (result == JOptionPane.OK_OPTION) {
                                passField.setText("");
                            }                           
                        }
                        break;
                    }
                }
            }
            if (! userNameFound) {
                int result = JOptionPane.showConfirmDialog(null, "Incorrect password!", "Login incomplete", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);
                if (result == JOptionPane.OK_OPTION) {
                    passField.setText("");
                }                           
            }