Java 什么';下面我在ObjectStream中的写作和阅读出错了吗
下面的代码将我的对象和字节[]写入文件,其中sigBytes为我的字节[]Java 什么';下面我在ObjectStream中的写作和阅读出错了吗,java,byte,objectinputstream,objectoutputstream,Java,Byte,Objectinputstream,Objectoutputstream,下面的代码将我的对象和字节[]写入文件,其中sigBytes为我的字节[] ObjectOutputStream outputOS = new ObjectOutputStream(new FileOutputStream(outputFile)); outputOS.writeInt(sigBytes.length); outputOS.write(sigBytes); outputOS.writeObject(text); outputOS.close();
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
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
在encryption3.encryption3.decrypt(encryption3.java:34)
位于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);
}
}
从
异常,表示由于未读原语数据或流中属于序列化对象的数据结束而导致对象读取操作失败。在两种情况下可能引发此异常:
当流中的下一个元素是基元数据时,尝试读取对象。在这种情况下,OptionalDataException的长度字段设置为可立即从流中读取的基本数据字节数,而eof字段设置为false
试图通过类定义的readObject或readExternal方法读取超过数据末尾的数据。在这种情况下,OptionalDataException的eof字段设置为true,长度字段设置为0
编辑:您的代码在我的计算机上也运行良好
根据你的代码
您已经在使用以下语句将文本
作为字符串
对象写入文件:
outputOS.writeObject(text);
通过将字符串转换为byte[]和write byte[]length+字节数组,可能不需要以下语句来写入字符串
outputOS.writeInt(sigBytes.length);
outputOS.write(sigBytes);
从
异常,表示由于未读原语数据或流中属于序列化对象的数据结束而导致对象读取操作失败。在两种情况下可能引发此异常:
当流中的下一个元素是基元数据时,尝试读取对象。在这种情况下,OptionalDataException的长度字段设置为可立即从流中读取的基本数据字节数,而eof字段设置为false
试图通过类定义的readObject或readExternal方法读取超过数据末尾的数据。在这种情况下,OptionalDataException的eof字段设置为true,长度字段设置为0
编辑:您的代码在我的计算机上也运行良好
根据你的代码
您已经在使用以下语句将文本
作为字符串
对象写入文件:
outputOS.writeObject(text);
通过将字符串转换为byte[]和write byte[]length+字节数组,可能不需要以下语句来写入字符串
outputOS.writeInt(sigBytes.length);
outputOS.write(sigBytes);
我相信我理解这里可能出了什么问题。。。您当前使用的是read(sigBytes)
,这并不保证它将读取您请求的所有数据。通常,InputStream.read(byte[])
和InputStream.read(byte[],int,int)
只保证在返回之前读取一些数据,除非流关闭。他们完全有可能读取比要求的数据少的数据—例如,如果您通过网络读取数据,则通常会发生这种情况,流可以返回其已接收的数据,但不会永远阻塞等待更多数据的到来
如果只读取了部分数据,那么后续的readObject
调用将从原始数据中的某个任意点读取,这很容易导致引发异常,因为它不可能是有效对象表示的开始
在这种情况下,我相信您希望:
inputIS.readFully(sigBytes);
where保证填充字节数组,或者如果它在完成之前到达流的末尾,将抛出异常。我相信我理解这里可能出现的错误。。。您当前使用的是read(sigBytes)
,这并不保证它将读取您请求的所有数据。通常,InputStream.read(byte[])
和InputStream.read(byte[],int,int)
只保证在返回之前读取一些数据,除非流关闭。他们完全有可能读取比要求的数据少的数据—例如,如果您通过网络读取数据,则通常会发生这种情况,流可以返回其已接收的数据,但不会永远阻塞等待更多数据的到来
如果只读取了部分数据,那么后续的readObject
调用将从原始数据中的某个任意点读取,这很容易导致引发异常,因为它不可能是有效对象表示的开始
在这种情况下,我相信您希望:
inputIS.readFully(sigBytes);
保证填充字节数组的位置,或者如果在完成之前到达流的末尾,将抛出异常。在哪一行获得异常?关于异常的可能原因,您的推理是什么?(为什么您调用writeObject
而不是writeString
?)您可以在ObjectOutputStream中重现此异常吗?没有writeString简单的解释:您正在读取的文件不是由写入例程生成的。正如@JonSkeet已经说过的,你能给出一个可复制的例子吗。啊,是的-我在想数据输出。在哪一行你会得到异常?关于异常的可能原因,您的推理是什么?(为什么您调用writeObject
而不是writeString
?)您可以在ObjectOutputStream中重现此异常吗?没有writeString简单的解释:您正在读取的文件不是由写入例程生成的。正如@JonSkeet已经说过的,你能给出一个可复制的例子吗。啊,没错-我在想DataOutp