所以,让我说我有这个代码
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异常 怎么摆脱那个?
答案 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);
}
}
}