2009-08-08 2 views
1

Есть ли способ ограничить максимальный размер буфера для чтения из ObjectInputStream в java?Как ограничить максимальный размер, прочитанный через ObjectInputStream из Socket?

Я хочу остановить десериализацию, если станет ясно, что объект, о котором идет речь, вызван злобно огромным.

Конечно, есть ObjectInputStream.read (byte [] buf, int off, int len), но я не хочу страдать от штрафа за выделение, например byte [1000000].

Я что-то упустил?

ответ

4

Вы пишете FilterInputStream, который выдает исключение, если обнаруживает, что он прочитал больше определенного количества данных из его основного потока.

+0

Tanky вы очень много! Очень хорошая обертка! – SAL9000

2

Я вижу два способа:
1) делайте свои чтения в цикле, захватывая куски, размер распределения которых вам удобен, и выйдите и остановитесь, когда вы достигнете своего предела; или 2) Выделите буфер максимального размера один раз и повторно используйте его для последующих чтений.

+0

Большое вам спасибо! Я буду использовать № 1 и попытаюсь обернуть его в предложение Jon Skeets FilterInputStream. – SAL9000

+0

Добро пожаловать. ** Ответ Джона Скита ** превосходит, imo. Они эквивалентны с точки зрения «что происходит», но «FilterInputStream» намного яснее и более стандартным. Меньше переосмысления колес. – CPerkins

1

На самом деле, есть очень простой способ.

Вы можете использовать ByteBuffer от NIO и использовать метод allocateDirect. Этот метод позволит вам выделить файл с отображением памяти, поэтому он не имеет огромных накладных расходов, и вы можете ограничить его размер.

Затем, вместо того, чтобы получать поток из сокета, получите канал.

Код:

Socket s; 

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

Теперь, не пытайтесь вызвать метод на буфер байтов в ") (массив"; он не работает в буфере с прямым распределением. Однако вы можете указать wrap the buffer as an input stream и отправить его в ObjectInputStream для дальнейшей обработки.

Смежные вопросы