我在 NetBeans IDE 8.1 中使用 Java8 + 。
这是家庭作业的一部分,但这一次我找的答案比什么都重要。
我基本上只限于JDK,不允许使用以下代码:
基本上我的选项仅限于变量,基本字符串方法(indexOf(),contains()等),for / while循环,if / then或if / else,FileInputStream,Scanner和其他非常基本的代码。即使使用我的Delimiter将文件读入数组也可能会有问题。
我有一个简单的身份验证系统的代码。在文本文件中,我有6个“用户”,其中包含用户名,摘要,纯文本密码及其帐户角色。我把文本文件拉成了一个二维数组,并用它来比较。用户收到一个对话框输入用户名,然后另一个输入密码。 while循环会比较用户名和密码,然后报告Good login.
或Bad login.
问题是,它对第一个用户有效,或者输入的信息不正确。对于用户2-6,它会陷入“输入用户名和密码”无限循环。以下是相关代码。另外,请提前感谢您的帮助。
文件:credentials.txt:分隔符为\ t(制表符)和\ r \ n(回车符)
griffin.keyes 108de81c31bf9c622f76876b74e9285f alphabet soup zookeeper
rosario.dawson 3e34baa4ee2ff767af8c120a496742b5 animal doctor admin
bernie.gorilla a584efafa8f9ea7fe5cf18442f32b07b secret password veterinarian
donald.monkey 17b1b7d8a706696ed220bc414f729ad3 M0nk3y business zookeeper
jerome.grizzlybear 3adea92111e6307f8f2aae4721e77900 grizzly1234 veterinarian
bruce.grizzlybear 0d107d09f5bbe40cade3de5c71e9e9b7 letmein admin
主要课程:
import java.io.IOException;
public class TestAuthenticationSystem {
public static void main(String[] args) throws IOException, Exception {
TestSystemLogin sysLogin = new TestSystemLogin(); // Object of SystemLogin
int loginCounter = 0; // Tracks login attempts.
final int LOGIN_MAX = 3; // Max login attempts.
// Have User attempt to login.
while (loginCounter <= (LOGIN_MAX - 1)) {
sysLogin.setCredArray();
sysLogin.setCredentials(); // Set credentials
if (sysLogin.matchUsername(sysLogin.getCredArray(), sysLogin.getUsername()) == true) {
if (sysLogin.passwordMatch(sysLogin.getCredArray(), sysLogin.getUsername())
== true) {
System.out.println("Good login.");
break;
}
else {
++loginCounter;
System.out.println("Bad login.");
}
}
}
}
}
第二节课:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
public class TestSystemLogin {
private FileInputStream fileByteStream = null; // File input stream
private Scanner inFS = null; // Scanner object
final private Scanner input;
private String username = ""; // Holds username
private String password = ""; // Holds password
private final String [][] credArray = new String[6][4]; // Array for credentials.txt
public TestSystemLogin() {
this.input = new Scanner(System.in);
}
public void setCredentials() {
System.out.println("Enter Username: ");
username = input.next().toLowerCase();
input.nextLine();
System.out.println("Enter Password: ");
password = input.nextLine();
}
// Return variable username.
public String getUsername() {
return username;
}
// Return variable password.
public String getPassword() {
return password;
}
public void setCredArray() throws IOException {
int i = 0; // Index variable
int j = 0; // Index variable
// Import credentials data.
fileByteStream = new FileInputStream("credentials.txt");
inFS = new Scanner(fileByteStream);
// Use carriage return and tab as token separators
inFS.useDelimiter("[\\r\\t]");
// Create array of credentials.txt
for (i = 0; i < 6; ++i) {
for (j = 0; j < 4; ++j) {
credArray[i][j] = inFS.next();
}
}
fileByteStream.close(); //Closes file.
}
public String[][] getCredArray() {
return credArray;
}
// Compare username to recorded username.
public boolean matchUsername(String[][] credArray, String userUsername) boolean isTrue = false;
int i = 0;
for (i = 0; i < credArray.length; ++i) {
if (credArray[i][0].equals(userUsername)) {
isTrue = true;
break;
}
}
return isTrue;
}
public boolean passwordMatch(String[][] credArray, String userUsername) {
boolean isTrue = false;
int i = 0;
for (i = 0; i < credArray.length; ++i) {
if (credArray[i][0].equals(userUsername)) {
if (credArray[i][2].equals(password)) {
isTrue = true;
break;
}
}
}
return isTrue;
}
}
期待的内容: 我可以输入6个用户名中的任意一个,以及相应的密码,并收到“Good login。”
发生了什么: 对于2-6号用户,我陷入了无限循环,要求输入用户名和密码。
以前的答案建议不要使用二维数组,而是将每个用户信息放入一个类中。这可能不创建额外的类吗?如果是这样,请提供所述类的示例,以及为每个用户调用的相应代码。
答案 0 :(得分:1)
只有在错误登录尝试> = 3时,您的while循环才会结束,否则,将始终发生此无限循环。此外,一旦从文件中读取所有条目,就需要另一个条件来终止循环。
一个建议,你在迭代中读取文件,填充数组,关闭文件,继续整个过程,再次读取文件,填充数组并继续执行应该以只读文件的方式更改的文件一次,填充二维数组并进行比较。
答案 1 :(得分:0)
运行代码我在阅读credentials.txt时遇到了问题。要验证您的代码是否在您的计算机上正确读取了credentials.txt,请输出您使用
替换读取循环所读取的数据 // Create array of credentials.txt
for (i = 0; i < NUM_ROWS_CRED; ++i) {
for (j = 0; j < NUM_COLS_CRED; ++j) {
String s = inFS.next();
System.out.print(s+" ");
credArray[i][j] = s;
}
System.out.println();
}
最后,我不得不重新配置扫描仪以读取credentials.txt以接受换行字符作为分隔符:
// Use carriage return and tab as token separators
inFS.useDelimiter("[\\r\\n\\t]");