【问题标题】:How can I get an ObjectInputStream that supports mark/reset?如何获得支持标记/重置的 ObjectInputStream?
【发布时间】:2016-08-07 13:02:41
【问题描述】:

我正在尝试获取一个ObjectInputStream,它允许我从中读取数据,如果它的类型不正确,则将数据放回流中(使用markreset)一些其他的代码来处理。我尝试将从Socket(以下示例中的s)检索到的InputStream 包装在BufferedInputStream 中,然后将其包装在ObjectInputStream 中,因为我认为这是解决方案,但是在调用@987654329 时@false 仍然返回。以下是该尝试:

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

非常感谢任何帮助!

【问题讨论】:

  • s.getInputStream() 是如何创建的?
  • 为什么不让“其他代码”处理已读取的对象而不是输入流。
  • @JohnnyV sSocket 类型,使用ServerSocket 创建,随后调用s.accept() 来创建连接。
  • @rodit 我正在使用多个线程,所以当我可以将它推回流中直到另一个线程有机会读取它时,发送它会比我相信的更麻烦.
  • @HarveyAdcock 我明白了。

标签: java objectinputstream


【解决方案1】:

我会在流之上构建一个更高级别的抽象。像这样的东西(伪代码,未最终确定):

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()

【讨论】:

  • 谢谢,我认为在不同的InputStream 子类的数量中已经有一些实现,但我想不会。也许我知道的不够多,但我觉得很奇怪,因为传递给ObjectInputStream 的实际InputStream 类型支持标记并重置ObjectInputStream 本身会支持它。所以本质上BufferedObjectStream 可以调用它的InputStreammarkSupported() 方法而不是仅仅返回false,你知道为什么不是这样吗?
  • ObjectInputStream 是一个有状态的流,它需要保留对它已经读取的对象的引用,以便在它们被流的未来对象引用时不会重新创建它们。我怀疑倒退并不明显。
猜你喜欢
  • 2015-06-28
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 2014-10-14
  • 2018-07-13
相关资源
最近更新 更多