如何获得支持 mark/reset 的 ObjectInputStream?
How can I get an ObjectInputStream that supports mark/reset?
我正在尝试获取一个 ObjectInputStream
以允许我从中读取数据,如果类型不正确,则将数据放回流中(使用 mark
和 reset
) 用于处理其他一些代码。我已经尝试将从 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()
。
我正在尝试获取一个 ObjectInputStream
以允许我从中读取数据,如果类型不正确,则将数据放回流中(使用 mark
和 reset
) 用于处理其他一些代码。我已经尝试将从 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()
。