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)
我相信我明白这里可能出了什么问题……您目前正在使用read(sigBytes)
它并不能保证它会读取您请求的所有数据。在一般情况下,InputStream.read(byte[])
并InputStream.read(byte[], int, int)
唯一保证,他们会读一些回来,除非流被关闭之前的数据。他们完全有可能读取比要求的更少的数据 - 如果您通过网络读取数据,这通常会发生,例如,流可以返回它已经收到的数据,但不会永远阻塞等待更多数据即将到来。
如果仅读取部分数据,则后续readObject
调用将从原始数据中的某个任意点读取,这很容易导致抛出异常,因为它不太可能是有效对象表示的开始。
在这种情况下,我相信您想要:
inputIS.readFully(sigBytes);
Run Code Online (Sandbox Code Playgroud)
其中被保证以填充字节数组,或者如果它完成之前到达流的末尾将抛出异常。readFully