Как прочитать файл с помощью ObjectInputStream и добавить объекты в HashSet? - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь прочитать файл и добавить все объекты в HashSet, но у меня появляется ошибка «Пользователь не может быть приведен к java.util.HashSet».Как я могу это исправить?

private void readFromFile(String file){
    Set<User> users = new HashSet<User>();
    try(FileInputStream fileInputStream = new FileInputStream(file)){
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        users = (HashSet) objectInputStream.readObject();

        System.out.println(users);
        objectInputStream.close();

    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

И как я могу использовать сериализацию более одного объекта в файл?Например (я использую сканер и пытаюсь ввести имя и фамилию), когда я делаю это, в моем файле есть только один объект.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Сначала, как упоминал @Nicholas K,

, поскольку вы записали User объекты в поток, затем вы должны прочитать User объекты после.

И, как вы сказали

Когда я попробовал это, у меня был только один объект, но мой файл включает более трех пользователей

У вас есть один объект, потому что вы читаете только один объект ,

Вызов

User user = (User) objectInputStream.readObject();

читает только один пользователь (если существует).Вызов read() еще раз, и вы получите свой второй объект (опять же, если он существует).

Так что все, что вам нужно сделать, это:

private void readFromFile(String file){
        Set<User> users = new HashSet<User>();
        try(FileInputStream fileInputStream = new FileInputStream(file)){
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

            while (true) {
                User user = (User) objectInputStream.readObject();
                users.add(user);    
            }

        } catch(EOFException e){
            // This exception is raised because the whole file was read.
            // So print the users in the set.

            for (User user : users) {
                System.out.println(user);
            }

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }finally{
            // Never forget to close the stream after you're done
            if (objectInputStream!=null) {
                objectInputStream.close();
            }
    }
0 голосов
/ 24 ноября 2018

Вам необходимо привести объект, возвращенный objectInputStream.readObject() к User, а затем добавить его к HashSet

. Измените

users = (HashSet) objectInputStream.readObject();  <--- can't cast User to HashSet

на следующее

.
User user = (User) objectInputStream.readObject();
users.add(user);
...