有没有办法限制从java中的ObjectInputStream读取的最大缓冲区大小?
如果很明显有问题的对象被制作得非常庞大,我想停止反序列化。
当然,有ObjectInputStream.read(byte [] buf,int off,int len),但我不想受到分配的性能损失,比如byte [1000000]。
我在这里错过了什么吗?
答案 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以进行进一步处理。