Java - чтение csv файлов с помощью DAO

241
31 августа 2017, 18:19

Стоит задача создавать и записывать обьекты с файла csv. В данный момент стоит задача сделать связь контролера с базой админов, так как в java только начинающий - интересует правильно ли составлен код? А также админ, который залогинится должен будет иметь доступ к остальным админам, правильно ли будет создать еще один метод который добавляет все обьекты админов в ArrayList. ? Хочу услышать комментарии по коду.

Controller:

    AOAdmin admin = new DAOAdmin();
    Admin admin1 = admin.load("cc12954", "123345");

DAO:

public class DAOAdmin implements AdminDao{
private static final String basePath = "/Users/valik/Desktop/queststore-system-team_power/src/Admins.csv";
public DAOAdmin() {
}
public Admin load(String id, String password) {
    try {
        FileReader fr = new FileReader(basePath);
        BufferedReader br = new BufferedReader(fr);
        Scanner scnr = new Scanner(br);
        while(scnr.hasNextLine()){
            String line = scnr.nextLine();
            String nLine [] = line.split(",");
            if(nLine[4].equals(id) && nLine[2].equals(password)) {
                Admin a = createAdminFromRow(nLine);
                return a;
            }
        }
    } catch (IOException e) {
        System.out.println("File not found");
    }return new Admin();
}

public void saveAdmin(){
    System.out.println("not implemented");
}
public Admin createAdminFromRow(String[] nLine){
    Admin a = new Admin();
    String AdmLogin = nLine[4];
    String AdmName = nLine[0];
    a.setName(AdmName);
    a.setLogin(AdmLogin);
    return a;

   }
}
Answer 1

Java конвенция раздел Constants

private static final String basePath = "/Users/valik/Desktop/queststore-system-team_power/src/Admins.csv";

Заменяем на

private static final String BASE_PATH = "/Users/valik/Desktop/queststore-system-team_power/src/Admins.csv";

раздел Variables

String AdmLogin = nLine[4];
String AdmName = nLine[0];

Заменяем на

String login = nLine[4];
String name = nLine[0];

Хардкодить полный путь не стоит, используем ресурсы

private static final String FILE_NAME = "Admins.csv";
File csvFile = new File(getClass().getClassLoader().getResource(FILE_NAME).getFile());

Закрываем IO ресурсы и отдельно обрабатываем ошибки

try(Scanner scanner = new Scanner(new BufferedReader(new FileReader(csvFile)))) {
...
} catch (FileNotFoundException e) {
    System.err.println("File not found");
} catch (IOException e) {
    System.err.println("Failed to read file " + e.getMessage());

}

В итоге получилось

public class DAOAdmin {
    private static final String FILE_NAME = "Admins.csv";
    public Admin load(String id, String password) {
        File csvFile = new File(getClass().getClassLoader().getResource(FILE_NAME).getFile());
        try (Scanner scanner = new Scanner(new BufferedReader(new FileReader(csvFile)))) {
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                String nLine[] = line.split(",");
                if (nLine[4].equals(id) && nLine[2].equals(password)) {
                    return createAdminFromRow(nLine);
                }
            }
        } catch (FileNotFoundException e) {
            System.err.println("File not found");
        } catch (IOException e) {
            System.err.println("Failed to read file " + e.getMessage());
        }
        return new Admin();
    }
    public void saveAdmin() {
        System.out.println("not implemented");
    }
    public Admin createAdminFromRow(String[] nLine) {
        Admin admin = new Admin();
        String login = nLine[4];
        String name = nLine[0];
        admin.setName(login);
        admin.setLogin(name);
        return admin;
    }
}

Или используя Java 8

public class DAOAdmin implements AdminDao {
    private static final String FILE_NAME = "Admins.csv";
    public Admin load(String id, String password) {
        Path filePath = Paths.get(getClass().getClassLoader().getResource(FILE_NAME).getFile());
        try {
            return Files.lines(filePath)
                    .map(line -> line.split(","))
                    .filter(parts -> parts[4].equals(id) && parts[2].equals(password))
                    .findFirst()
                    .map(this::parseAdmin)
                    .orElseGet(Admin::new);
        } catch (IOException e) {
            System.err.println("Failed to read csv " + e.getMessage());
        }
        return new Admin();
    }
    private Admin parseAdmin(String parts[]) {
        Admin admin = new Admin();
        admin.setName(parts[4]);
        admin.setLogin(parts[0]);
        return admin;
    }
}
READ ALSO
Некорректно отображает русский шрифт

Некорректно отображает русский шрифт

Есть метод, который в зависимости от локали пользователя выводит сообщениеПроблема в том, что не отображаются русские символы

314
Как работает оператор ==

Как работает оператор ==

Как работает оператор проверки на равенство ("=="), имеются ли ему альтернативы и в каких ситуациях следует его применять?

349
Без причины ошибка The database file is locked (database is locked)

Без причины ошибка The database file is locked (database is locked)

В общем, создал бота для телеграмаИспользую один, естественно, статический объект Connection для доступа к БД

323
Как узнать размер результата запроса в JPA?

Как узнать размер результата запроса в JPA?

Что-то совсем запутался с этим JPA(( Есть запрос

229