首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从.txt文件使用ObjectInputStream.readObject()进行迭代

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

Stack Overflow用户
提问于 2019-04-11 22:47:15
回答 3查看 1.1K关注 0票数 0

我在使用ObjectInputStream的readObject()-method从.txt文件中读取对象数据时遇到问题。我正在将多个用户对象写到一个.txt中,以便在程序的服务器关闭时保存用户,并且写得很好,尽管当我试图读回信息时,我不知道如何循环/读取文件中的下一行。

代码语言:javascript
复制
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-object中,并将其存储在registeredUsers-list中。

EN

回答 3

Stack Overflow用户

发布于 2019-04-12 13:43:01

好了,我解决了!

代码语言:javascript
复制
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();

        }
    }
票数 0
EN

Stack Overflow用户

发布于 2019-04-11 23:14:55

问题:你在while循环中读了两次。

  1. 第一次调用:

objectIn.readObject()

  • 第二次调用:

registeredUsers.add((User)objectIn.readObject());

解决方案:

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

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

  1. 不要让while循环如此复杂。
  2. 不需要在while循环中使用单独的布尔计数器。
  3. 只需要类型转换一次给用户,而不是多次(在readObject()调用自身的时候)。

请参考以下代码:

代码语言:javascript
复制
User user = null;
while((user = (User) objectIn.readObject()) != null){
                registeredUsers.add(user);
                userPasswords.put(user.getUsername(), user.getPassword());
                System.out.println(user.getUsername());
        }
票数 -1
EN

Stack Overflow用户

发布于 2019-04-11 23:55:04

你已经从文件中获取数据了吗?我以前用竖线分隔的文件("|")这样做过,所以: value1|value2|value3

不确定您的文件的构成,但是如果您已经在读取数据,那么可以跳到下一行,创建新的用户对象,如下所示:

代码语言:javascript
复制
    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
    }

}

这应该会创建一个用户列表,我会用另一种方法将它们保存到数据库中。但是你可以随心所欲地去做。同样值得注意的是-在我的文件中,我有一个标题行作为第一行。所以这段代码将跳过第一行。同样,不确定您的文件是如何设置的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55635360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档