Java分裂忽略空白

时间:2018-05-05 08:14:22

标签: java arrays split

所以,让我说我有这个代码

String some = ("my name|username|password");
String[] split = some.split("|");

我想要一个像这样的字符串

split[0] = "my name";
split[1] = "username";
split[0] = "password";

这是我的代码

String record = null;
FileReader in = null;
MainMenu menu = null;
public void checkLogin() throws FileNotFoundException, IOException, ArrayIndexOutOfBoundsException {
    in = new FileReader("D:\\Login.txt");
    BufferedReader br = new BufferedReader(in);

    String username = txfUsername.getText();
    String password = new String(txfPassword.getPassword());

    while ((record = br.readLine()) != null) {

        String[] split = record.split("-");

        if (username.equals(split[1]) && password.equals(split[2])) {

            JFrame frame = new JFrame();
            menu = new MainMenu(split[0]);
            this.setVisible(false);
            menu.setVisible(true);

            break;
        }
    }

    if (menu == null) {
        JOptionPane.showMessageDialog(null, "Username or Password wrong.");
    }
}

这是login.txt

my name-user-pass

当我运行程序时,它将抛出arrayindexoutofbound异常 怎么摆脱那个?

1 个答案:

答案 0 :(得分:0)

在我看来,在处理文本文件时,您希望始终确保实际处理数据行,尤其是在您的应用程序不负责创建文本文件的情况下。您还应始终注意这样一个事实:数据行可能不包含所有必需的数据,以便在使用 String.split()时消除遇到 ArrayIndexOutOfBoundsException 的可能性方法。

您可能还希望允许一种机制来处理文本文件中的注释行,以便可以添加一些注释行。这些线当然会被忽略,就像空行一样。在这种情况下,文本文件路径和文件名在方法中是硬编码的,但如果文件是用户可通过JFileChooser(或其他任何东西)选择,那么如果文件的第一行是注释行指示什么是好的该文件用于,例如:

;MyAppName Login Data

;Real Name, Login Name, Password
John Doe, johnnyboy, cGFzczEyMzQ
Bill Smith, BoperBill, U3VwZXJDb29sMQ
Tracey Johnson, tracey, NzcyMzQ2Ng
Fred Flinstone, PebblesDaddy, V2lsbWEnc19EdWRl 

在上面的示例文件布局中,以分号(;)开头的行被视为注释行。第一个评论是文件描述符。当读取文件时,将检查此行,如果它指出了预期的内容,那么您就知道它很可能是一个正确的文本文件来处理,否则用户提供或选择了错误的文本文件。

您会注意到密码已加密。甚至你都不应该知道它们是什么。密码仅供用户使用。这里使用了一个简单的Base64 Encryption(需要Java 8+),但仅用于示例目的。对于某些应用程序来说可能已经足够好了,但绝对不是所有应用程序,但仍然有些东西比什么都没有好。

要根据您的情况加密Base64中的密码,您可以使用( import java.util.Base64 ):

String password = Base64.getEncoder().withoutPadding().
        encodeToString(String.valueOf(txfPassword.
        getPassword()).getBytes());

在将用户密码保存到文件之前执行此操作。

以下是 checkLogin()方法的外观:

public void checkLogin() throws FileNotFoundException, IOException {
    // Try with Resources...This will auto-close the BufferReader.
    try (BufferedReader br = new BufferedReader(new FileReader("D:\\Login.txt"))) {
        // Install code here to validate that txfUsername and txfPassword 
        // text boxes actually contain something. Exit method if not.
        // ................................

        String userName = txfUsername.getText();
        // Encrypt supplied password and compare to what is in file
        String password = Base64.getEncoder().withoutPadding().encodeToString(String.valueOf(txfPassword.getPassword()).getBytes());

        if (userName.equals("") || password.equals("")) {
            return;
        }

        String line;
        int lineCounter = 0;
        boolean loginSuccess = false;
        while ((line = br.readLine().trim()) != null) {
            lineCounter++;
            // Is this the right data file?
            if (lineCounter == 1 && !line.equals(";MyAppName Login Data")) {
                JOptionPane.showMessageDialog(this, "Wrong Text File Supplied!",
                        "Invalid Data File", JOptionPane.WARNING_MESSAGE);
                return;
            }
            // Skip blank and comment lines...
            if (line.equals("") || line.startsWith(";")) { continue; }

            // Split the comma/space delimited data line (", ")
            String[] lineSplit = line.split(",\\s+"); // \\s+ means 1 or more spaces
            // make sure we have three array elements
            if (lineSplit.length == 3 && userName.equals(lineSplit[1]) && password.equals(lineSplit[2])) {
                loginSuccess = true;
                JFrame frame = new JFrame();
                menu = new MainMenu(lineSplit[0]);
                this.setVisible(false);
                menu.setVisible(true);
                break;
            }
        }
        // Can't find login name or password in file.
        if (!loginSuccess) {
            JOptionPane.showMessageDialog(this, "Invalid User Name or Password!", 
                    "Invalid Login", JOptionPane.WARNING_MESSAGE);
        }
    } 
}