Как ограничить максимальный размер чтения через ObjectInputStream из сокета? - PullRequest
1 голос
/ 08 августа 2009

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

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

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

Я что-то здесь упускаю?

Ответы [ 3 ]

5 голосов
/ 08 августа 2009

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

2 голосов
/ 08 августа 2009

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

1 голос
/ 08 августа 2009

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

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

Затем вместо получения потока из сокета получите канал.

Код:

    Socket s;

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

Теперь не пытайтесь вызывать метод array () в байтовом буфере; он не работает с напрямую выделенным буфером. Однако вы можете обернуть буфер как входной поток и отправить его в ObjectInputStream для дальнейшей обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...