Не могу считать данные из файла, ошибка кастинга
Учу java и пишу только на java core. Пробую написать маленький проект следуя трeхуровневой архитектуре. Что я пробую сделать.
- У меня есть класс User данные этого класса я успешно записал в файлик.
- Дальше эти данные я хочу прочитать с файлика и уже с помощью других методов с этими данными работать.
ПРОБЛЕМА в том что при чтение с файла мне выпадает ошибка.
Как это исправить чтобы я мог использовать эти данные для других методов (которые в будущем буду писать)?
Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class Model.User (java.lang.String is in module java.base of loader 'bootstrap'; Model.User is in unnamed module of loader 'app')
at Repository.UserRepository.readObject(UserRepository.java:35)
at Demo.UserDemo.main(UserDemo.java:21)
Пробовал решать проблему через другой метод записи и чтения с файла и в какой-то момент снова выпадала эта ошибка. Очень прощу вашей помощи.
Class User
package Model;
import java.util.Objects;
public class User extends GeneralModelClass {
private Long id;
private String userName;
private String password;
private String country;
private UserType userType;
public User(Long id, String userName, String password, String country, UserType userType) {
this.id = id;
this.userName = userName;
this.password = password;
this.country = country;
this.userType = userType;
}
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
public String getCountry() {
return country;
}
public UserType getUserType() {
return userType;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id) &&
Objects.equals(userName, user.userName) &&
Objects.equals(password, user.password) &&
Objects.equals(country, user.country) &&
userType == user.userType;
}
@Override
public int hashCode() {
return Objects.hash(id, userName, password, country, userType);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", country='" + country + '\'' +
", userType=" + userType +
'}';
}
}
Класс UserDemo где я запускаю код
package Demo;
import Controller.UserController;
import DataBase.Path;
import Model.User;
import Model.UserType;
import Repository.UserRepository;
public class UserDemo {
public static void main(String[] args) throws Exception {
UserController userController = new UserController();
UserRepository userRepository = new UserRepository();
Path path = new Path();
User user1 = new User(1L, "nameTest1", "01234", "PL", UserType.USER);
User user2 = new User(2L, "nameTest2", "56789", "PL", UserType.USER);
//userController.registerUser(user2, path.userDB);//работает
userRepository.readObject(path.userDB);// не работает
}
}
Класс Repository
import Model.User;
import java.util.Random;
public class UserRepository extends GeneralRepository<User> {
public User registerUser(User user, String path) throws Exception {
return writeObject(user, path);
}
@Override
public String typeRecord(User user) {
Random random = new Random();
user.setId(random.nextLong());
if (user.getId() < 0) {
user.setId(-1 * user.getId());
}
return user.getId() + "," + user.getCountry() + "," + user.getPassword() + "," + user.getUserName() + "," + user.getUserType();
}
@Override
public User readObject(String path) throws Exception {
return super.readObject(path);
}
}
И класс с методами на чтение и запись
package Repository;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public abstract class GeneralRepository<T> {
Validation validation = new Validation();
public T readObject(String path) throws Exception {
validation.validate(path);
List<T> objectList = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
String line;
while ((line = br.readLine()) != null) {
objectList.add((T) line);
}
} catch (FileNotFoundException e) {
System.err.println("File does not exist");
} catch (IOException e) {
System.err.println("File with path " + path + " not found");
}
System.out.println(objectList.toString());
return (T) objectList.toString();
}
public T writeObject(T t, String path) throws Exception {
validation.validate(path);
try (BufferedWriter bw = new BufferedWriter(new FileWriter(path, true))) {
File file = new File(path);
if (file.length() != 0)
bw.append("\n");
bw.append(typeRecord(t));
return t;
} catch (IOException e) {
System.err.println("Can't write to file" + path);
}
return null;
}
public abstract String typeRecord(T t);
}
Ответы (1 шт):
@tym32167 прав в том смысле что вам нужно будет написать interface какой-нибудь parsable и реализовывать его в ваших классах для вызова их в местах где описал @tym32167.
objectList.add(T.parse(line)); //для парсинга
public List<T implements Parsable> readObject(String path) // объявление метода. возращяем лист так как предполагаем несколько объектов.
Ну и возврат тогда будет адекватным
return objectList;