2017-04-01 60 views
1

我必須實現登錄系統,併爲此創建帳戶時將數據保存在文本文件中。數據格式爲{用戶名} {密碼} {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用戶名可以在第一行,密碼可以在第三行,並且會有匹配。那不是我想要的。他們必須在同一條線上進行比賽。

回答

3

首先,我認爲您需要準確地獲得您的要求 - 那麼想想程序中的對與錯會容易得多。

我假設用戶名是正確的,那麼它將在文件中出現一次。如果用戶名不正確,它很可能不會出現在文件中;但是,如果名稱彼此相似,我們不能排除某人意外輸入其他用戶名的可能性。

!username.equals(usernameField.getText())您不應該執行任何操作的兩種情況下,只需繼續在文件中搜索正確的用戶名即可。

一旦你找到了正確的用戶名,你可以根據密碼是否正確來做你必須做的事情。之後,如果你喜歡,你可以跳出循環,因爲你知道在文件後面再也找不到用戶名。

最後,如果您沒有找到用戶名完成文件的所有操作,則應該發出有關用戶名錯誤的消息。

在代碼中,這樣的事情(未測試):

  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(""); 
       }       
      } 
+1

多德這個完美的作品。你只是在while循環中錯過了'line = br.read()',一切都按照我的意願工作。謝謝! –