【问题标题】:Java ObjectInputStream throws EOFException while reading a primitiveJava ObjectInputStream 在读取原语时抛出 EOFException
【发布时间】:2016-04-10 21:01:09
【问题描述】:

我很难理解 Java 中输出/输入流的行为。

ObjectOutputStream 实现了 DataOutput 接口,因此作为 DataOutputStream,它具有编写原语的方法。

但是反转写入的字节 ObjectInputStream 会抛出 EOF。

    byte array[]=new byte[50];
    byte value=2;
    System.out.println(value); //prints 2


    ByteArrayOutputStream os=new ByteArrayOutputStream();
    ObjectOutputStream oss=new ObjectOutputStream(os);
    oss.writeByte(value);

    array = os.toByteArray();

    //get back the original value from the byte array
    ObjectInputStream ois=new ObjectInputStream(new ByteArrayInputStream(array));
    byte result=ois.readByte(); // -> throws EOF Exception (see below)

    System.out.println("Result -> "+result);

抛出此异常

Exception in thread "main" java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:392)
    at java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2827)
    at java.io.ObjectInputStream.readInt(ObjectInputStream.java:971)
    at z.reti.TestOOS.main(TestOOS.java:21)

使用其他原语会引发相同的异常。 用 Byte 包装类(并使用 Read/WriteObject)替换原始字节,问题就消失了……

有没有办法将 ObjectOutputStream 和 ObjectInputStream 与原语一起使用?

【问题讨论】:

    标签: java objectoutputstream


    【解决方案1】:

    您没有关闭 ObjectOutputStream。只需在您添加oss.writeByte(value) 之后添加oss.close(),您的程序就会按预期运行。

    【讨论】:

    • 没错。为什么使用 writeObject 没有出现问题?
    • @Z856 可能是因为在这种情况下流被刷新了
    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多