我正在使用Java8+中的NetBeans IDE 8.1。
这是家庭作业的一部分,但这次我最想要的是一个答案。
我仅限于JDK,不允许使用以下代码:
基本上,我的选项仅限于变量、基本字符串方法(indexOf()、code ()等)、用于/while循环、if/然后或if/else、FileInputStream、Scanner和其他非常基本的代码。即使使用我的分隔符将文件读入数组,也可能是有问题的。
对于简单的身份验证系统,我有很好的代码。在文本文件中,我有6个“用户”,具有用户名、摘要、纯文本密码以及他们的帐户角色。我已经把文本文件拉到了一个二维数组中,并将其与之进行比较。用户收到一个对话框以输入用户名,然后另一个对话框输入密码。while循环比较用户名和密码,然后报告Good login.或Bad login.,问题是它对于第一个用户非常有效,或者输入了不正确的信息。对于用户2-6,它被卡在一个“输入用户名和密码”无限循环中。下面是相关代码。此外,预先感谢您的协助。
文件: credentials.txt:分隔符是\t (选项卡)和\r (回车)
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个用户名,并相应的密码,并收到“良好的登录”。
正在发生的事情:为用户2-6,我陷入了一个无限循环询问用户名和密码。
以前的答案建议不要使用二维数组,而是将每个用户信息放入一个类中。如果不创建额外的类,这是可能的吗?如果是,请为每个用户提供上述类的示例,以及相应的调用代码。
发布于 2016-10-06 21:05:34
只有当错误的登录尝试是>= 3时,才会结束while循环,否则,这个无限循环总是会发生的。另外,在从文件中读取所有条目后,还需要另一个条件来终止循环。
一项建议是,您可以在每次迭代中读取文件,填充数组,关闭文件,继续整个过程,再次读取文件、填充数组,并继续进行应该更改的操作,只需读取一次文件,填充二维数组并进行比较。
发布于 2016-10-06 21:24:48
运行您的代码时,我在读取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]");https://stackoverflow.com/questions/39905422
复制相似问题