如何获得支持 mark/reset 的 ObjectInputStream?

How can I get an ObjectInputStream that supports mark/reset?

我正在尝试获取一个 ObjectInputStream 以允许我从中读取数据,如果类型不正确,则将数据放回流中(使用 markreset) 用于处理其他一些代码。我已经尝试将从 Socket 中检索到的 InputStream(下例中的 s)包装在 BufferedInputStream 中,然后按照我的想法将其包装在 ObjectInputStream 中成为解决方案,但是在调用 ois.markSupported() 时仍然返回 false。下面是那个尝试:

ois = new ObjectInputStream(new BufferedInputStream(s.getInputStream()));

非常感谢任何帮助!

我会在流之上构建更高级别的抽象。像这样(伪代码,未定稿):

public class Buffer {
    private final ObjectInputStream in;

    private Object current;

    public Buffer(ObjectInputStream in) {
        this.in = in;
    }

    public Object peek() {
        if (current == null) {
            current = in.readObject();
        }
        return current;
    }

    public void next() {
        current = in.readObject();
    }
}

你会重复使用 peek() 来获取当前对象,如果它适合你,调用 next() 转到下一个。

当然,你需要处理异常,流结束,正确关闭等等。但是你应该明白了。

或者,如果您可以只读取内存中的所有内容,那么就这样做并使用流中的对象创建一个队列,然后传递该队列并使用 peek()poll()