2014-01-13 66 views
1

我正在试图创建一个JFrame来检查放置在JTextField中的文本是否与.txt文件中的信息相同。 然后如果这是正确的,它会检查JPasswordField中的信息是否与.txt文件中的信息匹配。为什么我的字符串检查代码不工作

public void actionPerformed(ActionEvent e) 
{ 
    if(e.getSource() == button) 
    { 
     if(!username.getText().equals("") && passIsGood()) 
     { 
      try 
      { 
       Scanner reader = new Scanner(new File("users.txt")); 
       reader.useDelimiter("\t|\n"); 
       reader.nextLine(); 
       while(reader.hasNextLine()) 
       { 
        if(reader.next().equals(username.getText())) 
        { 
         //Username is correct, now checks for password: 
         System.out.println("Username passed");  
         if(reader.next().equals(passToString())) 
         { 
          //Username & Password are correct 
          System.out.println("Password passed"); 
          break; 
         } 
        } else if(!reader.hasNextLine()) 
        { 
         wrongInfo(); 
        } else 
        { 
         reader.nextLine(); 
        } 
       } 
       reader.close(); 
       frame.dispose(); 
      } catch(Exception ex) 
      { 
       JOptionPane.showMessageDialog(null, ex); 
      } 
     } else 
     { 
      JOptionPane.showMessageDialog(null, "Please enter a valid Username and Password"); 
     } 
    } 
} 

private static String passToString() 
{ 
    String passString = new String(password.getPassword()); 
    return passString; 
} 

我得到尽可能的用户名路过,但我觉得像.equals(passToString())可能是造成问题的原因。 文本文件看起来像这样: 用户名密码 测试thetest test2的thetest3

注意,在每个字段之间的空间是使用标签,因此我的分隔符(“\ t | \ n”);

+0

users.txt中的每个第二个字段后是一个新行 – Otanan

+0

为什么你需要在顶部调用reader.nextLine()? – sasankad

+0

@sasankad我的.txt文件的第一行是用于格式化的,它说“用户名密码”作为第一行来表示如何写出其余的内容,我想忽略它 – Otanan

回答

1

包含在您的文本字段中的字符串可能包含一些不需要的字符。使用字符域(所有ascii值是一个符号)来摆脱这些。试试这个:

import java.io.File; 
import java.util.Scanner; 

public class readUsers { 

    public static void main(String[] args) { 
     try { 
      Scanner reader = new Scanner(new File("users.txt")); 
      reader.useDelimiter("\t|\n"); 

      String username = "username"; 
      String password = "password"; 

      for (int i = 0; i < username.length(); i++) { 
       //replace possible unwanted characters 
       if (username.charAt(i) < 33 || username.charAt(i) > 126) 
        username = username.replace(Character.toString(username.charAt(i)), ""); 
      } 

      for (int j = 0; j < password.length(); j++) { 
       //replace possible unwanted characters 
       if (password.charAt(j) < 33 || password.charAt(j) > 126) 
        password = password.replace(Character.toString(password.charAt(j)), ""); 
      } 

      while (reader.hasNextLine()) { 
       String user = reader.next(); 
       String pass = reader.next(); 

       //if username equals the user in the textfile, check if password equals the pass in the file 
       if (user.equals(username)) { 
        System.out.println("username passed!"); 
        if (pass.equals(password)) 
         System.out.println("password passed!"); 
       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我的文本文件看起来是这样的:
用户名密码
USERNAME2密码

附:这是我的第一个StackOverFlow有史以来的答案,纠正我,如果我做错了什么:)

+0

谢谢你的回应!尽管如此,我发现了一个相当简单的解决方案,事实证明我的问题是用户名中包含一个看似不明显的\ n,因此我简单地使用了String.trim();方法来解决它,谢谢不管! – Otanan

+1

虽然我不知道哪个字符导致了问题;) – pietv8x

相关问题