如何使用ObjectInputStream读取文件并将对象添加到HashSet?

时间:2018-11-24 10:25:48

标签: java set objectinputstream

我正在尝试读取文件并将所有对象添加到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();
    }
}

如何使用多个对象序列化到文件中? 例如(我正在使用Scanner并尝试输入名称和姓氏),当我这样做时,我的文件只有一个对象。

2 个答案:

答案 0 :(得分:1)

您需要将objectInputStream.readObject()返回的对象强制转换为User,然后将其添加到HashSet

更改此

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

到以下

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

答案 1 :(得分:1)

首先,正如@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();
            }
    }