gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:36:32 25 4
gpt4 key购买 nike

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

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

然后当我执行下面的代码时,我得到一个 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();

下面是我在 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);
}
}

最佳答案

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

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

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

inputIS.readFully(sigBytes);

哪里 readFully 保证填充字节数组,否则如果它在完成之前到达流的末尾将抛出异常。

关于java - 我在 ObjectStream 中的以下写作和阅读出了什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35070008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com