我编写一个程序,每次创建新密钥时都需要将“密钥”对象存储到文件中。我还需要能够读取文件中的所有键,并能够根据需要单独使用每个键。它只工作一个就没问题,但是当尝试添加多个时,它要么不会写入文件,要么无法正确读取(说实话,不确定)。这是对写/读方法的一窥
(写入文件方法)
```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会成为它的一部分并发布。谢谢
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你的代码片段来看,问题可能出在你每次写入新密钥时都创建了一个新的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
异常,尤其是在生产环境中。