如何限制从Socket通过ObjectInputStream读取的最大大小?

时间:2009-08-08 17:47:53

标签: java sockets serialization stream

有没有办法限制从java中的ObjectInputStream读取的最大缓冲区大小?

如果很明显有问题的对象被制作得非常庞大,我想停止反序列化。

当然,有ObjectInputStream.read(byte [] buf,int off,int len),但我不想受到分配的性能损失,比如byte [1000000]。

我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:5)

你编写了一个FilterInputStream,如果发现它已从其基础流中读取了超过一定数量的数据,则会抛出异常。

答案 1 :(得分:2)

我可以看到两种方式:
1)循环读取,抓取你喜欢的分配大小的块,当你达到极限时退出和停止;要么 2)分配一次max-size缓冲区并重新用于后续读取。

答案 2 :(得分:1)

实际上,这是一种非常简单的方法。

您可以使用NIO的ByteBuffer,并使用allocateDirect方法。此方法将允许您分配内存映射文件,因此它没有巨大的开销,您可以限制其大小。

然后,不是从套接字获取流,而是获取Channel。

代码:

    Socket s;

    ByteBuffer buffer = ByteBuffer.allocateDirect(10 * 1024 * 1024);
    s.getChannel().read(buffer);

现在,不要尝试在字节缓冲区上调用“array()”方法;它不适用于直接分配的缓冲区。但是,您可以wrap the buffer as an input stream将其发送到ObjectInputStream以进行进一步处理。