2017-02-12 9 views
0

Я пытаюсь прочитать CSV-файл из другого класса, а затем взять данные и сравнить их с информацией для входа, указанной пользователем в основном классе. Я могу сделать это, поставив все в основной класс, но он выглядит не очень аккуратно.Чтение CSV-файла с использованием другого класса, а затем вход в систему java

--Main--

package supscription.service; 

/** 
* 
* @author jakec 
*/ 
import java.util.*; 
public class SubscriptionService { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

    String username; 
    String password; 

    Scanner input = new Scanner(System.in); 

    System.out.println("Log in:"); 
    System.out.println("username: "); 
    username = input.nextLine(); 

    System.out.println("password: "); 
    password = input.nextLine(); 

    users check = new users(username, password); 

    if(check.auth()) 
     System.out.println("You are logged in"); 
    else 
     System.out.println("Log in failed"); 
    } 

} 

--users--

public class users { 

private String username; 
private String password; 
private String File = ("MEMBER.csv"); 
Scanner scan = new Scanner (SubscriptionService.class.getResourceAsStream(File)).useDelimiter(","); 
String user = scan.nextLine(); 
String pass = scan.nextLine(); 

public users(String user, String pass){ 
    username = user; 
    password = pass; 
} 

public boolean auth(){ 
    if((username.equals (user)) && (password.equals (pass))) 
     return true; 
    else 
     return false; 
} 

} 

--The CSV--

Member_ID,Username,Password 
11001,Jack Brown,123 
11009,James White,12 
11014,Barbara Jones,58 
... 
+0

Похоже, что этот вопрос может быть более уместным для 'CodeReview.SE', но я бы сказал, что сохранение паролей в ящике отлично подходит для упражнения, но не для производственного кода, и что разбор CSV-файла таким образом будет если данные «11007», «Брайан Грин, младший», 123456'. Я бы использовал [Apache Commons CSV] (https://commons.apache.org/proper/commons-csv/). –

+0

Да, я знаю это, не волнуйтесь, я использую это только как практику, и спасибо, что указали мне на обзор кода. У меня будет вид ура. –

ответ

0

Ваш Approch правильно. Для поиска конкретного пользователя вам необходимо сначала прочитать всех пользователей и сохранить их, скажем, list. Вы можете сделать следующее:

  1. Создать user класс для хранения информации
  2. пользователя Создать метод чтения всех пользователей
  3. Создать метод поиска пользователю

Для шага 1, пользовательский класс может иметь идентификатор, имя пользователя и пароль, e, g .:

class User{ 

    private int id; 
    private String username; 
    private String password; 

    public User(int id, String username, String password){ 
     this.id = id; 
     this.username = username; 
     this.password = password; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public String getPassword() { 
     return password; 
    } 
} 

Для шага 2 вы можете c reate класс обслуживания и читать все пользователи, например:

class Users{ 

    private static List<User> users; 

    public static synchronized void readUsers(){ 
     if(null == users){ 
      users = new ArrayList<User>(); 
      String File = ("MEMBER.csv"); 
      Scanner scan = new Scanner (Users.class.getResourceAsStream(File)); 
      String line; 
      while((line = scan.nextLine()) != null){ 
       String[] tokens = line.split(","); 
       users.add(new User(Integer.parseInt(tokens[0]), tokens[1], tokens[2])); 
      } 
      scan.close(); 
     } 
    } 
} 

Для шага 3, необходимо добавить еще один метод в классе обслуживания, который будет искать в списке и вернуть true или false, например:

public static synchronized boolean find(String username, String password){ 
    if(null == users){ 
     throw new IllegalStateException("user list is not initialised"); 
    } 

    return users.stream() 
      .filter(u -> u.getUsername().equals(username)) 
      .filter(u -> u.getPassword().equals(password)) 
      .findFirst() 
      .isPresent(); 
} 

Это вернет true или false на основании того, существует ли в списке User.

В вашем main классе, вы можете использовать следующий поток:

  • инициализации список пользователей
  • чтения имени пользователя и пароля с помощью командной строки
  • Вызов find метод и распечатать соответствующий выход

Обратите внимание, что все методы класса Users: static, поэтому вам не нужно создавать obj ЭСТ. Вы можете напрямую вызвать методы, например. Users.readUsers();

+0

Я изменил основной класс, но я получаю сообщение о том, что список не был инициализирован: –

+0

Не знаю, что там произошло. Я изменил основной класс, но я получаю ошибку, что список не был инициализирован. Вот как я его инициализировал: Список users = new ArrayList(); Я назвал класс сервисов UserReader. –

+0

Не могли бы вы обновить вопрос с помощью нового кода? –