当我尝试从文件中读取加密对象时获取StreamCorruptedException

时间:2014-03-31 18:25:27

标签: java android file-io fileinputstream fileoutputstream

当我尝试读取存储在文件中的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);

1 个答案:

答案 0 :(得分:0)

在我指定的行中,我能想到的唯一可能的异常原因是:

当您从另一个InputStream构造一个新的ObjectInputStream时,构造函数会尝试从另一个InputStream中读取一个头。如果它无法读取并验证此标头,则会抛出StreamCorrupted Exception。如果它无法读取标题,或者标题错误(例如,包含不同的幻数或版本号),就会发生这种情况。

是否有可能在输入流尝试从中读取相应的输出流之前没有创建?或者两个不同的线程都试图从cipherOutputStream中读取?

如果对象的写入需要很长时间,那么在构造它之后可能需要直接刷新outputStream,这样至少会立即写入标题:

            outputStream = new ObjectOutputStream(cipherOutputStream);
            outputStream.flush();
            outputStream.writeObject(object);
            outputStream.close();

最后,我假设您使用相同的密钥进行解密,就像您以前加密一样。如果没有,那么这可能导致标题被错误地解密。