1

我要序列化一个对象并反序列化该对象,但我得到:

  1. 0 为可用()
  2. -1 表示读取()
  3. readByte() 的 EOFException

    public static Element getCacheObject(String key, String cacheName, String server) throws IOException, ClassNotFoundException, ConnectException {
        String url = StringUtils.join(new String[] { server, cacheName, key}, "/");
        GetMethod getMethod = new GetMethod(url);
        ObjectInputStream oin = null;
        InputStream in = null;
        int status = -1;
        Element element = null;
        try {
            status = httpClient.executeMethod(getMethod);
            if (status == HttpStatus.SC_NOT_FOUND) { // if the content is deleted already               
                return null;
            }
            in = getMethod.getResponseBodyAsStream();
            oin = new ObjectInputStream(in);
            System.out.println("oin.available():" + oin.available()); // returns 0
            System.out.println("oin.read():" + oin.read()); // returns -1
            element = (Element) oin.readObject(); // returns the object
        }
        catch (Exception except) {
            except.printStackTrace();
            throw except;
        }
        finally {
            try {
                oin.close();
                in.close();
            }
            catch (Exception except) {
                except.printStackTrace();
            }
        }
    
        return element;
    }
    

我在这里想念什么?

4

3 回答 3

1

我认为您会看到这种行为,因为您首先创建ObjectInputStreamfromInputStream然后才available检查InputStream. 如果您检查构造函数,ObjectInputStream您可以看到以下内容:

public ObjectInputStream(InputStream in) throws IOException {
    verifySubclass();
    bin = new BlockDataInputStream(in);
    handles = new HandleTable(10);
    vlist = new ValidationList();
    enableOverride = false;
    readStreamHeader();
    bin.setBlockDataMode(true);
} 

有一种方法readStreamHeader可以从输入流中读取标头。InputStream因此,有可能在构建过程中读取所有数据ObjectInputStream

于 2013-02-18T07:59:57.857 回答
0

您正在调用变量,但available and read在变量上。inreadObjectoin

于 2013-02-18T07:55:36.200 回答
0

你在 EOS 上告诉你的信息流。available()没有阻塞地读取零字节;read()返回 -1 表示 EOS;readLine()将返回 null;并readXXX()为任何其他指示 EOS 的 XXX 抛出 EOFException;并readObject()返回一个Object因为您正在读取ObjectInputStream缓冲的 ,而不是您调用所有其他方法的流。注意,您不应该read()只是为了测试 EOS 而打电话;并且available()首先不是对 EOS 的有效测试:请参阅 Javadoc。

于 2013-02-18T09:09:26.547 回答