无法从文件中读取用户名

时间:2017-03-30 10:10:09

标签: java swing string-comparison

我正在尝试使用用户名密码和电子邮件来实施注册面板。我将所有用户名和密码放在一个文本文件" usernames.txt"中。但是如果用户点击提交按钮并且用户名已经存在则我的问题无法正常工作(它应该显示带有文本&#34的JOptionPane;用户名已经存在!")。这是我的代码:

submitButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            BufferedReader br = null;
            try {
                br = new BufferedReader(new FileReader("usernames.txt"));
            } catch (FileNotFoundException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
            try {   
                String line = br.readLine();
                StringBuilder sb = new StringBuilder();
                Pattern usernameAndPasswordPattern = Pattern.compile("^(\\S+) (\\S+)$");
                while (line != null) {
                    sb.append(line); // 
                    sb.append(System.lineSeparator()); // 
                    line = br.readLine();
                }
                String everything = sb.toString();
                Matcher userNameAndPasswordMatcher = usernameAndPasswordPattern.matcher(everything);

                //if username exists!
                while (userNameAndPasswordMatcher.matches()) {
                    String username = userNameAndPasswordMatcher.group(1);
                    String password = userNameAndPasswordMatcher.group(2);

                    if (username.equals(usernameTextField.getText())) {
                        int result = JOptionPane.showConfirmDialog(null, "Username already exists!", "Registration incomplete", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);
                    }
                }

            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } finally {
                try {
                    br.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }                       
        }
    });

在这里,您可以看到我面板中的图片

enter image description here

2 个答案:

答案 0 :(得分:2)

您说文件中的行包含用户名和密码。但是你正在测试这样的比赛:

boolean matches = Pattern.matches(""+usernameTextField.getText(), line);  

以上问题。

  1. matchPattern的{​​{1}}动词表示“它与整个字符串匹配”。

  2. Matcher的第一个参数应该是一个表示为字符串的正则表达式,而不仅仅是任何旧字符串。现在,如果用户名的字母表适合受限制,则可能使用该名称作为正则表达式。但这是一个坏主意。

  3. 即使在将“匹配”变为“查找”之后,您仍然可能使提供的用户名与文件中的用户名的密码或部分匹配。

  4. 脱离上下文(即忽略第3点),最好像这样做匹配:

    Pattern.matches(String, String)

    或者

    boolean matches = line.contains(""+usernameTextField.getText());  
    

    然而,仍有问题,你可能会得到错误的匹配;例如匹配部分用户名......甚至是密码。

    因此,正确的解决方案是制作匹配文件中整个用户名字段的正则表达式,或者将行拆分为字段(例如boolean matches = Pattern.find( Pattern.quote(""+usernameTextField.getText()), line); 然后使用{{ 1}}根据已提供的用户名测试相应的字段。

答案 1 :(得分:2)

虽然@StephenC的答案适用于您的情况,但它非常具体,我认为它可以更优雅地解决。

如何定义一个RegEx-Pattern,它将用户名和密码分成两组,因为你说过

  

usernames.txt的格式为{Username} {Password}

您可以使用RegEx ^(\S+) (\S+)$,这意味着组1中的非空白字符集后跟一个空格,然后是一组非空白字符的非空字符集(请在https://regex101.com/

这是用Javas自己的库实现的

private static final Pattern usernameAndPasswordPattern = Pattern.compile("^(\\S+) (\\S+)$");

public static void checkInput(String input) throws IOException {
  try(BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("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);

        if(username.equals(input)) {
          System.out.println("Username exists!");
          System.out.println("Password is: " + password);
          break;
        }
      }
      line = br.readLine();
    }
  }
}

我用它来测试它

public static void main(String[] args) throws IOException {
  System.out.println("main > calling checkInput('Gary')..");
  checkInput("Gary");
  System.out.println("main > calling checkInput('Donald')..");
  checkInput("Donald");
  System.out.println("main > calling checkInput('Gordon')..");
  checkInput("Gordon");
}

这是我的测试数据

Peter 123peter567
Gary newman
Gordon fr33m4n

和我的输出

main > calling checkInput('Gary')..
Username exists!
Password is: newman
main > calling checkInput('Donald')..
main > calling checkInput('Gordon')..
Username exists!
Password is: fr33m4n