我必須實現登錄系統,併爲此創建帳戶時將數據保存在文本文件中。數據格式爲{用戶名} {密碼} {bestScore}。但是,當涉及到登錄和我有更多的用戶。我的算法檢查文本文件的每一行,如果用戶存在,請轉到主菜單面板。如果用戶名不正確,請打開joptionpane告訴用戶用戶名對密碼不正確或相同。問題是它在所有情況下都會執行文件的第一行,而while循環中斷。那不是我的想法。我想檢查整個文本文件中的用戶名和密碼匹配。不是用於文件的每一行。這是我的代碼(這是不工作的方式我想):在文本文件中檢查用戶名和密碼
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();
}
}
});
在這裏你可以看到,在輸入的第一行,我會去的4例之一,while循環將停止。但是,如果用戶名在第二行,例如我得到了消息「不正確的用戶名」的對話框。我的想法之一是將文件中的所有內容追加到StringBuilder
,然後用.contains
來檢查用戶名和密碼是否存在,但我覺得它有點不對,因爲如果我匹配包含它的用戶名和密碼,它將檢查整個文本文件的組合。 E.g用戶名可以在第一行,密碼可以在第三行,並且會有匹配。那不是我想要的。他們必須在同一條線上進行比賽。
多德這個完美的作品。你只是在while循環中錯過了'line = br.read()',一切都按照我的意願工作。謝謝! –