从.txt文件使用ObjectInputStream.readObject()进行迭代

时间:2019-04-11 14:47:15

标签: java serialization

我无法使用ObjectInputStream的readObject()方法从.txt文件读取对象数据。 我正在将多个用户对象写入.txt文件,以在程序服务器关闭时保存用户,并且编写工作正常,尽管当我尝试回读信息时,我不知道如何循环/读取文件中的下一行。

public void readObjectFromFile() {
        boolean cont = true;
        User user;

try {
            FileInputStream fileIn = new FileInputStream("files/userlist.txt");
            ObjectInputStream objectIn = new ObjectInputStream(fileIn);


            while(cont){
                Object obj = objectIn.readObject();
                if(obj != null) {
                    registeredUsers.add((User)objectIn.readObject());
                    user = (User)obj;
                    userPasswords.put(user.getUsername(), user.getPassword());
                    System.out.println(user.getUsername());
                }else {
                    cont = false;
                }
            }

        }catch (Exception ex) {
            ex.printStackTrace();

        }
}

public void addUserToDatabase(User user) {
        try(FileOutputStream fos = new FileOutputStream("files/userlist.txt", true);
                ObjectOutputStream oos = new ObjectOutputStream(fos)){
            oos.writeObject(user);
            oos.write('\n');
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

我想逐行读取文件,并将每一行的信息存储在User对象中,并将其存储在registeredUsers列表中。

3 个答案:

答案 0 :(得分:0)

好的,我解决了!

public void readUsersFromFile() {
        try {
            FileInputStream fileIn = new FileInputStream("files/userlist.dat");
            ObjectInputStream objectIn = new ObjectInputStream(fileIn);
            boolean keepReading = true;
            try {
                while(keepReading) {
                    User user = (User)objectIn.readObject();
                    registeredUsers.add(user);
                    userPasswords.put(user.getUsername(), user.getPassword());
                    System.out.println(user.getUsername());
                    objectIn = new ObjectInputStream(fileIn);

                }
            }catch(EOFException e) {
                keepReading = false;
            }
        }catch (Exception ex) {
            ex.printStackTrace();

        }
    }

答案 1 :(得分:-1)

问题:您正在while循环中阅读两次。

  1. 第一个电话:
    objectIn.readObject()
  2. 第二通电话:
    registeredUsers.add((User) objectIn.readObject());

解决方案:

不要两次调用readObject()方法使用已经获取的引用。

除了功能性问题外,您还可以更正以下内容以使代码更好:

  1. 不要让while循环如此复杂。

  2. 在while循环中无需使用单独的布尔计数器。

  3. 只需多次向用户进行一次类型转换(在readObject()调用自身时)。

请参考以下代码:

User user = null;
while((user = (User) objectIn.readObject()) != null){
                registeredUsers.add(user);
                userPasswords.put(user.getUsername(), user.getPassword());
                System.out.println(user.getUsername());
        }

答案 2 :(得分:-1)

您已经从文件中获取数据了吗? 我之前使用管道分隔文件(“ |”)完成了此操作,因此: 值1 |值2 |值3

不确定文件的构成,但是如果您已经在读取数据,则可以跳到下一行并按如下方式创建新的User对象:

    private List <UserEntry> collectFileContents(InputStream is, String fileName) throws Exception {
    try {
        List <UserEntry> userEntries = new ArrayList <UserEntry>(); 
        String line = "";
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        br.readLine();
        while ((line = br.readLine()) != null) {
            if (line.length() > 0) {
                UserEntry entry = new UserEntry();
                try {
                    String[] lineValues = line.split("\\|",-1);
                    entry.setVal1(lineValues[0]);
                    entry.setVal2(lineValues[1]);
                    //etc..
                    userEntries.add(entry);
                } catch (ArrayIndexOutOfBoundsException  ex) {
                    //error handling here
                    continue;
                }
            }
        }
        return userEntries;
    }catch(Exception ex) {
        //error handling here
    }

}

这应该创建一个用户列表,然后我用另一种方法将它们保存到数据库中。但是您可以按自己的意愿做。还要注意-在我的文件中,标题行作为第一行。因此,此代码将跳过第一行。同样,不确定文件的设置方式。