【问题标题】:EOFException while reading object from ObjectInputStream?从 ObjectInputStream 读取对象时出现 EOFException?
【发布时间】:2020-06-03 10:03:57
【问题描述】:

我正在插入一个从解组 xml 中获得的可序列化对象。对于插入对象,我使用以下方法,即 insertPOJOInBackend()。但是,在使用方法 readPOJOFromBackend() 检索对象时,我收到了 EOFException。在过去的一周里,我一直在为这个例外而苦苦挣扎。我们将不胜感激。

insertPOJOInBackend(String key, String url, Serializable Object){

   //obtained connection object

    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new 
    BufferedOutputStream(connection.getOutputStream()));

    objectOutputStream.writeObject(serializableObject);
    objectOutputStream.close();

    BufferedReader rd = null;
    StringBuilder sb = null;
    String line = null;

    rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));

    sb = new StringBuilder();
    while ((line = rd.readLine()) != null) {
      sb.append(line);
    }

}

readPOJOFromBackend() {

HttpsURLConnection connection = null;
    try
    {
      //obtained connection object

      ObjectInputStream objectInputStream = new ObjectInputStream(new 
      BufferedInputStream(connection.getInputStream()));

      connection.getInputStream().close();

      responseObject = objectInputStream.readObject();

      objectInputStream.close();
    }
    catch (EOFException eof)
    {
      LOG.error("EOFException");
    }
}

我是否为 ObjectInputStream 过早关闭了输入流,或者请检查我哪里出错了?如果您需要任何其他信息,请告诉我。 我在调用 objectInputStream.readObject 时收到 EOFException。 PFB 堆栈跟踪。

java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2669)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3413)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:3214)
    at java.io.ObjectInputStream.readString(ObjectInputStream.java:1896)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1558)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2276)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2200)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:426)
    at java.util.ArrayList.readObject(ArrayList.java:778)
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1159)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2167)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2276)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2200)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:426)
    at java.util.ArrayList.readObject(ArrayList.java:778)
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1159)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2167)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2276)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2200)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2276)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2200)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2276)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2200)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:426)
    at **.**.**.common.backend.impl.BackednImpl.readPOJOFromBackend(XXXXXImpl.java:812)

【问题讨论】:

  • connection.getInputStream().close(); - 你得到 InputStream 并立即关闭它。读取对象后将其移至。
  • 你忘记贴发送代码了,很明显在发送对象之前已经关闭了连接。

标签: java serialization objectinputstream eofexception


【解决方案1】:

感谢@Amongalen 的解决方案和快速响应。

我在调用 objectInputStream.readObject() 之后移动了 connection.getInputStream().close(),它按预期工作。

呸。一整周!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 2012-09-22
    • 2012-09-10
    • 1970-01-01
    • 2016-04-10
    • 2016-04-30
    • 2013-02-16
    相关资源
    最近更新 更多