Вы можете сделать приличное приближение с помощью:
HttpURLConnection content = (HttpURLConnection) new URL("www.example.com").openConnection();
System.out.println(content.getContentLength());
Однако это будет указывать только длину определенного ресурса, который вы запрашиваете (например, HTML в базе URL). Вам также потребуется для просмотра HTML-кода на странице, просмотра всех ресурсов, на которые она ссылается (сценарии с других сайтов, изображения, видео и т. Д.), И суммирования их всех.
Это приблизит вас к общему размеру, но даже тогда вы не получите идеальный счет, потому что (а) не все URL будут возвращать эту информацию, и вы не имеете никакого контроля над этим, и (b) в зависимости от того, как загружается контент (например, с помощью вызовов AJAX, скрывающих подробности), вы не сможете заранее узнать полный список загружаемых ресурсов.
В качестве альтернативы, если URL не возвращает результат, я думаю, что Giacomo предлагал использовать CounterInputStream. Неплохая идея. Возможно, вы могли бы объединить вышеупомянутое предложение с CounterInputStream, чтобы вести подсчет суммы, которая была отправлена, и потенциально остановить передачу, когда она достигает указанного максимального общего размера передачи. Таким образом, вы, по сути, будете иметь прогнозируемый размер (скажем, сайт сообщает, что он будет 3,3 МБ), но при загрузке вы обнаруживаете, что на самом деле это 6 МБ и еще не остановился, и принимаете решение: больше не скачивать.