现在已经四天了,我是初学者,我似乎无法完成这项工作。 因此,到目前为止,我的程序将询问用户名,并在我打开的文件中查找匹配项。如果找到匹配项,它将询问userpassword,并且如果在文件中找到userpassword,它将检查用户名,密码,并且如果在行中有特定的单词以及凭据,它将打开一个凭据文件。 因此,如果第一次输入正确的用户名,我会执行我的代码,它要求输入密码,或者中断或让用户查看文件。很好。
但是,如果第一次尝试使用的用户名不正确,它将不会检查第二次是否正确。它仅在2次尝试后结束(应该是3次失败尝试)。 这是我的代码
public static void main(String[] args)throws Exception {
Scanner scnr = new Scanner(System.in);
//open credentials file
FileInputStream in = new FileInputStream ("./credentials.txt");
Scanner credentials = new Scanner(in);
// open zookeeper file
FileInputStream in1 = new FileInputStream ("./zookeeper.txt");
Scanner zookeeperInfo = new Scanner(in1);
FileInputStream in2 = new FileInputStream ("./admin.txt");
Scanner adminInfo = new Scanner(in2);
FileInputStream in3 = new FileInputStream ("./veterinarian.txt");
Scanner vetInfo = new Scanner(in3);
String userName = "";
String userPassword = "";
String original = "";
int numAttempts = 0;
boolean run = true;
while (run) {
System.out.println ("User Name or Q: ");
userName = scnr.nextLine();
if (userName.equals("Q") || numAttempts > 3) {
run = false;
System.out.println("Goodbye..");
}
else {
while(credentials.hasNextLine()) {
String line = credentials.nextLine();
if (line.contains(userName)) {
System.out.println(userName);
System.out.println("Gimme the password: ");
userPassword = scnr.nextLine();
original = userPassword;
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(original.getBytes());
byte[] digest = md.digest();
StringBuffer sb = new StringBuffer();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
if (line.contains(userName) && line.contains(sb.toString()) && line.contains("zookeeper")) {
while (zookeeperInfo.hasNextLine()) {
System.out.println(zookeeperInfo.nextLine() + " ");
}
break;
}
else if (line.contains(userName) && line.contains(sb.toString()) && line.contains("admin")) {
while (adminInfo.hasNextLine()) {
System.out.println(adminInfo.nextLine()+ " ");
}
break;
}
else if (line.contains(userName) && line.contains(sb.toString()) && line.contains("veterinarian")) {
while (vetInfo.hasNextLine()) {
System.out.println(vetInfo.nextLine() + " ");
}
break;
}
}
}
Picture of working part of the code Picture of non-working part
我真的不知道。我觉得我什至没有正确地做,但是我所有的尝试都在这里结束。我必须在周日之前提交,整周后都无济于事。 请帮助,任何建议将不胜感激!
答案 0 :(得分:1)
除了您的代码不容易阅读之外,我还为您制作了一些您可以使用的代码:
public static void main(String[] args) throws Exception {
Scanner userInput = new Scanner(System.in);
File file = new File("credentials.txt");
FileInputStream inputStream;
Scanner credentialsScanner;
File infosFile;
Scanner infoScanner = null;
FileInputStream infosInputStream;
boolean run = true;
int attempts = 0;
String username;
String password;
String line;
while (run) {
System.out.println("Give username:");
username = userInput.nextLine();
if (username.equals("Q") || attempts > 3) {
run = false;
} else {
inputStream = new FileInputStream(file);
credentialsScanner = new Scanner(inputStream);
while (credentialsScanner.hasNextLine()) {
line = credentialsScanner.nextLine();
System.out.println(line);
if (line.contains(username)) {
System.out.println("Give password:");
password = userInput.nextLine();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte[] digest = md.digest();
StringBuffer sb = new StringBuffer();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
if (line.contains(sb.toString())) {
if (line.contains("zookeeper")) {
infosFile = new File("zookeeperInfo.txt");
} else if (line.contains("admin")) {
infosFile = new File("adminInfo.txt");
} else if (line.contains("veterinarian")) {
infosFile = new File("vetInfo.txt");
}
infosInputStream = new FileInputStream(infosFile);
infoScanner = new Scanner(infosInputStream);
while (infoScanner != null && infoScanner.hasNextLine()) {
System.out.println(infoScanner.nextLine() + " ");
}
attempts = 0;
break;
}
}
}
attempts++;
}
}
}
如您所见,我简化了您的代码:
当我们继续该过程时:
接下来,使用MD5解码器进行密码验证。然后,如果当前林包含解码后的密码,请处理其他文件中的信息读取。
每次尝试后,我们都会增加尝试计数器,但是如果处理成功,我们将重置该计数器并中断循环。
这可能并不完全是您想要的,但是它可能会帮助您改善代码并更多地了解一些逻辑。
答案 1 :(得分:1)
根据您发布的代码,您的代码应该处于无限循环中,因为您不会在任何地方增加numAttempts,除非用户输入用户名“ Q”。您的代码在第二次尝试时不检查用户名的原因是,当文件中不存在用户名时,您一次尝试读取整个文件。
我不确定您的要求是什么,但是如果您已经为每个用户输入读取了文件,则必须为每个用户输入重新读取文件,或者将它们存储在hashmap的内存中以提高性能。
printf("%u\n",*(a+0));
如果您已经为每个用户输入处理了文件,我强烈建议将用户名读入内存。
希望这会有所帮助。如果您发布要求,我可以为您提供更好的代码。