我下面在 ObjectStream 中的写作和阅读出了什么问题

Wil*_*ngs 1 java byte objectoutputstream objectinputstream

下面的代码将我的对象和 byte[] 写入文件,sigBytes 是我的 byte[]

ObjectOutputStream outputOS = new ObjectOutputStream(new FileOutputStream(outputFile));
    outputOS.writeInt(sigBytes.length);
    outputOS.write(sigBytes);
    outputOS.writeObject(text);
    outputOS.close();
Run Code Online (Sandbox Code Playgroud)

然后当我执行下面的代码时,我得到一个 java.io.OptionalDataException

ObjectInputStream inputIS = new ObjectInputStream(new FileInputStream(INPUT));
    int length = inputIS.readInt();
    byte[] sigBytes = new byte[length];
    inputIS.read(sigBytes, 0, length);
    String text = (String) inputIS.readObject();
Run Code Online (Sandbox Code Playgroud)

在我得到的错误下面String text = (String) inputIS.readObject()

java.io.OptionalDataException at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) at encryption3.Encryption3.decrypt(Encryption3.java:34) at encryption3 .Encryption3.main(Encryption3.java:53)

编辑我不能让错误以最小的方式重复如下???我真的很累了..

public static void doThings() {

    try {
        File file = new File("C:/edges/input.ext");

        String text = "Hello";
        file.createNewFile();

        byte[] sigBytes = (text).getBytes();

        ObjectOutputStream outputOS = new ObjectOutputStream(new FileOutputStream(file));
        outputOS.writeInt(sigBytes.length);
        outputOS.write(sigBytes);
        outputOS.writeObject(text);

        ObjectInputStream inputIS = new ObjectInputStream(new FileInputStream(file));
        int length = inputIS.readInt();
        byte[] sigBytes2 = new byte[length];
        inputIS.read(sigBytes2, 0, length);
        String text2 = (String) inputIS.readObject();
    } catch (IOException | ClassNotFoundException ex) {
        Logger.getLogger(EncryptionError.class.getName()).log(Level.SEVERE, null, ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

我相信我明白这里可能出了什么问题……您目前正在使用read(sigBytes)它并不能保证它会读取您请求的所有数据。在一般情况下,InputStream.read(byte[])InputStream.read(byte[], int, int)唯一保证,他们会读一些回来,除非流被关闭之前的数据。他们完全有可能读取比要求的更少的数据 - 如果您通过网络读取数据,这通常会发生,例如,流可以返回它已经收到的数据,但不会永远阻塞等待更多数据即将到来。

如果仅读取部分数据,则后续readObject调用将从原始数据中的某个任意点读取,这很容易导致抛出异常,因为它不太可能是有效对象表示的开始。

在这种情况下,我相信您想要:

inputIS.readFully(sigBytes);
Run Code Online (Sandbox Code Playgroud)

其中保证以填充字节数组,或者如果它完成之前到达流的末尾将抛出异常。readFully