#java #string
#java #строка
Вопрос:
Я уверен, что на этот вопрос дан ответ, я получаю всевозможные результаты при поиске по нему, но я просто не могу понять эту концепцию. Это домашнее задание, и я предпочитаю понимать, почему я публикую. Назначение состоит в том, чтобы считывать учетные данные пользователя из файла, хэшировать пароль, а затем, если они совпадают, отображать содержимое другого файла, который связан с их ролью.
Я написал это в одном классе, а затем обнаружил, что присваивание требует как минимум двух классов. Поэтому для меня имело смысл читать файлы в 1 классе и делать все остальное в другом. Он работал очень хорошо как один класс, но это мое первое приключение в программировании, и у меня всего 6 классов. Я не понимаю основы так, как должен, поэтому в вашем ответе, если вы можете научить меня, почему код нуждается в изменении, я был бы благодарен. Мой код выглядит следующим образом;
package it145_final;
import java.util.Scanner;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class IT145_Final {
public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
Scanner scnr = new Scanner(System.in);
Scanner fileIn = null;
int failedAttempts = 0;
int i = 0;
String q = "q";
// objects that I think I need???? Maybe??? but dont know how to get them from the FinalFiles class
FinalFiles fileAdmin = new FinalFiles();
FinalFiles fileVet = new FinalFiles();
FinalFiles fileZoo = new FinalFiles();
FinalFiles userA = new FinalFiles();
fileAdmin.file();
userA.file();
while (failedAttempts < 3)
{
System.out.println("Enter user name, or q to exit"); //get username
String userName = scnr.next();
if (userName.equalsIgnoreCase(q)) //option to terminiate
{
System.out.println("Logging Out");
break;
}
System.out.println("Enter password"); // get password
scnr.nextLine();
String userPassword = scnr.nextLine();
//The following takes the entered password and hashes it
String hashedPass = userPassword;
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(hashedPass.getBytes());
byte[] digest = md.digest();
StringBuffer sb = new StringBuffer();
for (byte b : digest) {
sb.append(String.format("x", b amp; 0xff));
}
if (userName.equals(userA[i]) amp;amp; sb.toString().equals(userA[i 1]))
{
if (userA[i 3].equals("admin"))
{
System.out.println(admin);
break;
}
else if (userA[i 3].equals("veterinarian"))
{
System.out.println(veterinarian);
break;
}
else if (userA[i 3].equals("zookeeper"))
{
System.out.println(zookeeper);
break;
}
else
{
System.out.println("Failed attempt");
failedAttempts ;
}
}
if (userName.equals(userB[i]) amp;amp; sb.toString().equals(userB[i 1]))
{
if (userB[i 3].equals("admin"))
{
System.out.println(admin);
break;
}
else if (userB[i 3].equals("veterinarian"))
{
System.out.println(veterinarian);
break;
}
else if (userB[i 3].equals("zookeeper"))
{
System.out.println(zookeeper);
break;
}
else
{
System.out.println("Failed attempt");
failedAttempts ;
}
}
if (userName.equals(userC[i]) amp;amp; sb.toString().equals(userC[i 1]))
{
if (userC[i 3].equals("admin"))
{
System.out.println(admin);
break;
}
else if (userC[i 3].equals("veterinarian"))
{
System.out.println(veterinarian);
break;
}
else if (userC[i 3].equals("zookeeper"))
{
System.out.println(zookeeper);
break;
}
else
{
System.out.println("Failed attempt");
failedAttempts ;
}
}
if (userName.equals(userD[i]) amp;amp; sb.toString().equals(userD[i 1]))
{
if (userD[i 3].equals("admin"))
{
System.out.println(admin);
break;
}
else if (userD[i 3].equals("veterinarian"))
{
System.out.println(veterinarian);
break;
}
else if (userD[i 3].equals("zookeeper"))
{
System.out.println(zookeeper);
break;
}
else
{
System.out.println("Failed attempt");
failedAttempts ;
}
}
if (userName.equals(userE[i]) amp;amp; sb.toString().equals(userE[i 1]))
{
if (userE[i 3].equals("admin"))
{
System.out.println(admin);
break;
}
else if (userE[i 3].equals("veterinarian"))
{
System.out.println(veterinarian);
break;
}
else if (userE[i 3].equals("zookeeper"))
{
System.out.println(zookeeper);
break;
}
else
{
System.out.println("Failed attempt");
failedAttempts ;
}
}
if (userName.equals(userF[i]) amp;amp; sb.toString().equals(userF[i 1]))
{
if (userF[i 3].equals("admin"))
{
System.out.println(admin);
break;
}
else if (userF[i 3].equals("veterinarian"))
{
System.out.println(veterinarian);
break;
}
else if (userF[i 3].equals("zookeeper"))
{
System.out.println(zookeeper);
break;
}
else
{
System.out.println("Failed attempt");
failedAttempts ;
}
}
System.out.println("Login Failed");
failedAttempts ;
}
}
}
Вы можете видеть, что я начал создавать некоторые объекты, но я просто не могу понять, как, или если это вообще хороший способ, получить информацию из моего другого класса.
И класс, который я создал для чтения файлов, является;
package it145_final;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class FinalFiles {
public static void file() throws IOException{
String admin = "";
String veterinarian = "";
String zookeeper = "";
String[] userA = new String[4];
String[] userB = new String[4];
String[] userC = new String[4];
String[] userD = new String[4];
String[] userE = new String[4];
String[] userF = new String[4];
File file0 = new File("C:usercredentials.txt"); // Opens files
Scanner contents0 = new Scanner(file0);
File file1 = new File("C:admin.txt");
Scanner contents1 = new Scanner(file1);
File file2 = new File("C:veterinarian.txt");
Scanner contents2 = new Scanner(file2);
File file3 = new File("C:zookeeper.txt");
Scanner contents3 = new Scanner(file3);
// Following reads the files and assignes to variables as needed
while (contents1.hasNext())
{
admin = contents1.nextLine();
}
// System.out.println(admin); used to verify that admin was correct
while (contents2.hasNext())
{
veterinarian = contents2.nextLine();
}
while (contents3.hasNext())
{
zookeeper = contents3.nextLine();
}
while(contents0.hasNext())
{
String user1 = contents0.nextLine();//grabs the line from the file for each individual user
String user2 = contents0.nextLine();
String user3 = contents0.nextLine();
String user4 = contents0.nextLine();
String user5 = contents0.nextLine();
String user6 = contents0.nextLine();
userA = user1.split("t");//takes information on user and breaks it into an array
userB = user2.split("t");
userC = user3.split("t");
userD = user4.split("t");
userE = user5.split("t");
userF = user6.split("t");
System.out.println(userB[0]); //using for testing to make sure I am getting the correct info
System.out.println(userB[1]);
}
}
}
Я знаю, что это не аккуратно и аккуратно, и я уверен, что для меня есть лучшие способы написать что-то подобное, я просто сделал то, что думал, и то, что я знаю. Я думаю, если бы кто-нибудь мог просто показать мне, как передать эти строки (admin, veterinarian и zookeeper) вместе со строкой [], UserA UserB и т. Д. В мой main, Это снова сработало бы и было бы достаточно для кого-то с моим уровнем квалификации.
Приветствую Энди
Комментарии:
1. Вы написали метод main; таким образом, вы понимаете, как
String[]
они должны быть упорядочены. Я предлагаю вам создатьString[]
fromList<String>
со всеми строками, которые вам нужно передать.
Ответ №1:
Поскольку вы находитесь на начальном уровне кодирования, я бы попытался помочь вам немного понять логику, которая необходима для создания хорошего приложения.
Чтобы упростить себе задачу, вы должны думать, что для каждой задачи нужен класс. В вашем случае у вас должен быть один класс для получения файлов, а другой для проверки пароля. имейте в виду, что всегда есть один доминирующий класс, который запускает приложение и содержит метод main .
В этих отдельных классах вы должны создавать методы для разбиения процессов, делая код более понятным. В классе проверки пароля вам понадобится метод для каждого из этих заданий (чтение файлов, шифрование пароля, расшифровка пароля, проверка учетных данных друг с другом).
Затем верните значение обратно в первый класс. Так что это будет выглядеть примерно так.
class Main { //first class
public static void main(String[] args){
File = new File("file1"); //obtain file 1
File = new File("file2"); //obtain file 2
PasswordCheck checker = new PasswordCheck(); // call instance of second class
boolean credentialOk= passwordCheck.process(file1,file2)//calls method in second class and returns if the credentials match
}
}
class PasswordCheck { //second class
public passwordCheck(){
}//inistialise class
public boolean process(File file1, File file2){
}// method to process the files and returns if match succesfully or not
}
Комментарии:
1. Я думаю, я понимаю, что вы здесь говорите, и, если я прав, это потребует совсем немного переписывания. Я бы не возражал сделать это, если бы я лучше понимал, что я на самом деле делаю, мне потребовалось достаточно времени, чтобы заставить приведенный выше код работать, я не думаю, что у меня есть время переписать все это. Я скажу, что, несмотря на то, что это было сложно, это был один из самых забавных курсов, которые я прошел :). Продолжайте поступать предложения.
2. вначале это довольно сложно, но когда вы освоитесь, вы станете мастером. Ваш код не является неправильным, но может быть лучше структурирован, что поможет вам удовлетворить ваши требования. Поскольку от вас требуется только 2 класса, я бы сохранил то, что у вас уже есть, и попытался добавить еще один класс, как я показал.