开发者社区 问答 正文

从文件写入/读取多个对象

我编写一个程序,每次创建新密钥时都需要将“密钥”对象存储到文件中。我还需要能够读取文件中的所有键,并能够根据需要单独使用每个键。它只工作一个就没问题,但是当尝试添加多个时,它要么不会写入文件,要么无法正确读取(说实话,不确定)。这是对写/读方法的一窥

(写入文件方法)

   ```js

try { fileOut = new FileOutputStream(keyFile, true); objectOut = new ObjectOutputStream(fileOut);

            ArrayList<Key> keys = new ArrayList<Key>();

            keys.add(new Key(replace, replaceWith, IDtext));

            //debugging code here(removed for post)

            objectOut.writeObject(keys);
            objectOut.close();

        } catch (IOException e1) {
            e1.printStackTrace();
        }
(从文件方法(另一个类)读取)

     ```js
fileIn = new FileInputStream(keyFile);
        objIn = new ObjectInputStream(fileIn);

        ArrayList<Key> keys = (ArrayList<Key>)objIn.readObject();


        for (Key key : keys) {
            System.out.println("Read from key file: " + key.getName());
        }

就像我说的那样,它将从文件中读取一个并且只有一个对象。我敢肯定,我可以解决这个问题,但我喜欢这个网站并大量使用它,所以我以为id会成为它的一部分并发布。谢谢

展开
收起
几许相思几点泪 2019-12-05 15:09:33 448 分享 版权
阿里云 AI 助理回答

从你的代码片段来看,问题可能出在你每次写入新密钥时都创建了一个新的ArrayList实例,然后只添加了一个Key对象到这个新的列表中再写入文件。这样会导致文件中保存的是多个包含单个密钥的列表,而不是一个不断追加的密钥列表。

为了修复这个问题,你需要在写入方法中读取现有文件中的密钥列表(如果文件已存在),然后向这个列表中添加新的密钥,最后再将整个列表写回文件。以下是修改后的写入方法示例:

try {
    // 检查文件是否存在,如果不存在,则创建一个新的ArrayList
    ArrayList<Key> keys = new ArrayList<>();
    if (keyFile.exists()) {
        try (ObjectInputStream objIn = new ObjectInputStream(new FileInputStream(keyFile))) {
            keys = (ArrayList<Key>) objIn.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 添加新的Key到现有的keys列表中
    keys.add(new Key(replace, replaceWith, IDtext));

    try (ObjectOutputStream objectOut = new ObjectOutputStream(new FileOutputStream(keyFile, false))) {
        // 注意这里使用了false作为第二个参数,因为我们是要覆盖原文件写入更新后的列表
        objectOut.writeObject(keys);
    }

} catch (IOException e1) {
    e1.printStackTrace();
}

这段代码首先检查文件是否存在,如果存在则读取现有列表;然后向列表中添加新的密钥;最后,覆盖原文件内容,写入更新后的整个密钥列表。注意,这里关闭流的方式采用了try-with-resources语句,以确保资源能够被正确关闭。

对于读取方法,看起来没有明显的问题,只要写入方式正确,应该能正常工作。但请确保处理潜在的ClassNotFoundException异常,尤其是在生产环境中。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: