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