当我尝试读取存储在文件中的cripted对象时,显然一切似乎都工作我可以获得保存的值,但在日志中始终显示此错误
java.io.StreamCorruptedException
W/System.err﹕ at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2067)
W/System.err﹕ at java.io.ObjectInputStream.<init>(ObjectInputStream.java:372)
我并不知道如何解决这个问题
我用它来加载:
ObjectInputStream inputStream = null;
try {
inputStream = new ObjectInputStream(cipherInputStream);
} catch (IOException e) {
e.printStackTrace();
}
if (inputStream != null) {
try {
myDecipheredObject = (Serializable) inputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
这将存储
ObjectOutputStream outputStream = null;
try {
outputStream = new ObjectOutputStream(cipherOutputStream);
outputStream.writeObject(object);
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (RuntimeException e) {
e.printStackTrace();
}
此负载方法
中发生错误inputStream = new ObjectInputStream(cipherInputStream);
答案 0 :(得分:0)
在我指定的行中,我能想到的唯一可能的异常原因是:
当您从另一个InputStream构造一个新的ObjectInputStream时,构造函数会尝试从另一个InputStream中读取一个头。如果它无法读取并验证此标头,则会抛出StreamCorrupted Exception。如果它无法读取标题,或者标题错误(例如,包含不同的幻数或版本号),就会发生这种情况。
是否有可能在输入流尝试从中读取相应的输出流之前没有创建?或者两个不同的线程都试图从cipherOutputStream中读取?
如果对象的写入需要很长时间,那么在构造它之后可能需要直接刷新outputStream,这样至少会立即写入标题:
outputStream = new ObjectOutputStream(cipherOutputStream);
outputStream.flush();
outputStream.writeObject(object);
outputStream.close();
最后,我假设您使用相同的密钥进行解密,就像您以前加密一样。如果没有,那么这可能导致标题被错误地解密。