Есть онлайн-файл (например, http://www.example.com/information.asp
), который мне нужно взять и сохранить в каталоге. Я знаю, что есть несколько способов построчного захвата и чтения онлайн-файлов (URL), но есть ли способ просто загрузить и сохранить файл с помощью Java?
425
Ответы:
Дайте Java NIO попробовать:
Использование
transferFrom()
является потенциально гораздо более эффективным , чем простой цикл , который считывает данные из канала источника и записывает на этот канал. Многие операционные системы могут передавать байты непосредственно из исходного канала в кеш файловой системы, фактически не копируя их.Проверьте больше об этом здесь .
Примечание . Третий параметр в TransferFrom - это максимальное количество байтов для передачи.
Integer.MAX_VALUE
будет передавать не более 2 ^ 31 байта,Long.MAX_VALUE
разрешит максимум 2 ^ 63 байта (больше, чем любой существующий файл).источник
8388608
туберкулез?transferFrom()
isnt 'указан для завершения всей передачи за один вызов. Вот почему он возвращает счет. Вы должны зациклить.URL::openStream()
возвращает обычный поток, то есть весь трафик все еще копируется через массивы Java byte [], а не остается в собственных буферах. Толькоfos.getChannel()
на самом деле является родным каналом, поэтому накладные расходы остаются в полном объеме. Это нулевая выгода от использования NIO в этом случае. Помимо того, что EJP и Бен Макканн правильно заметили, что они сломаны.Используйте apache commons-io , всего один строчный код:
источник
copyURLToFile
параметр timeout доступен только с версии 2.0 библиотеки Commons IO. Смотрите документацию по JavaУпрощенное использование nio:
источник
InputStream.read()
вернуть ноль, если вы не указали буфер нулевой длины или счетчик, «небольшую паузу» или иное. Он будет блокироваться до тех пор, пока не будет передан хотя бы один байт или пока не закончится поток или не произойдет ошибка. Ваше заявление о внутренностяхFiles.copy()
безосновательно.Вам нужно будет обработать исключения, возможно, внешние для этого метода.
источник
in.close
выдает исключение,fout.close
не вызывается.BufferedInputStream
имеет точно нулевой эффект на время ожидания сокета. Я уже опроверг это как «городской миф» в моих комментариях к «второстепенным деталям», которые вы цитировали. Тремя годами ранееBufferedInputStream
«может вызвать непредсказуемые сбои»).Это старый вопрос, но вот краткое, читаемое, JDK-решение с правильно закрытыми ресурсами:
Две строки кода и никаких зависимостей.
источник
import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths;
Для загрузки файла необходимо прочитать его, в любом случае вам придется каким-то образом просматривать файл. Вместо того, чтобы построчно, вы можете просто прочитать его байтами из потока:
источник
При использовании
Java 7+
используйте следующий метод, чтобы загрузить файл из Интернета и сохранить его в каком-либо каталоге:Документация здесь .
источник
Этот ответ почти так же, как выбранный ответ, но с двумя улучшениями: это метод, и он закрывает объект FileOutputStream:
источник
transferFrom()
isnt 'указан для завершения всей передачи за один вызов. Вот почему он возвращает счет. Вы должны зациклить.источник
in.close
выдает исключение,out.close
не вызывается.Лично я обнаружил, что Apache HttpClient более чем способен на все, что мне нужно сделать в связи с этим. Вот отличное руководство по использованию HttpClient
источник
Это еще один вариант java7, основанный на ответе Брайана Риска с использованием оператора try-with:
источник
transferFrom()
isnt 'указан для завершения всей передачи за один вызов. Вот почему он возвращает счет. Вы должны зациклить.Можно загрузить файл с помощью Apache
HttpComponents
вместоCommons-IO
. Этот код позволяет загружать файл в Java в соответствии с его URL-адресом и сохранять его в определенном месте назначения.В отличие от одной строки кода:
этот код даст вам больший контроль над процессом и позволит вам указать не только тайм-ауты, но
User-Agent
иReferer
значения, которые важны для многих веб-сайтов.источник
Здесь есть много элегантных и эффективных ответов. Но краткость может заставить нас потерять некоторую полезную информацию. В частности, часто не требуется рассматривать ошибку соединения как исключение , и можно по-разному относиться к каким-либо сетевым ошибкам, например, чтобы решить, следует ли повторить попытку загрузки.
Вот метод, который не выбрасывает исключения для сетевых ошибок (только для действительно исключительных проблем, таких как неправильный URL или проблемы с записью в файл)
источник
Ниже приведен пример кода для загрузки фильма из Интернета с использованием кода Java:
источник
Существует проблема с простым использованием:
если вам нужно скачать и сохранить очень большие файлы, или вообще, если вам нужны автоматические повторные попытки в случае разрыва соединения.
В таких случаях я предлагаю использовать Apache HttpClient вместе с org.apache.commons.io.FileUtils. Например:
источник
Подводить итоги (и как-то полировать и обновлять) предыдущие ответы. Три следующих метода практически эквивалентны. (Я добавил явные тайм-ауты, потому что я думаю, что они просто необходимы, никто не хочет, чтобы загрузка зависла навсегда, когда соединение потеряно.)
Я не нахожу существенных различий, мне все кажется правильным. Они безопасны и эффективны. (Различия в скорости кажутся едва уместными - я записываю 180Mb с локального сервера на SSD-диск во времена, которые колеблются от 1,2 до 1,5 сегментов). Они не требуют внешних библиотек. Все работают с произвольными размерами и (по моему опыту) перенаправления HTTP.
Кроме того, все выбрасывают,
FileNotFoundException
если ресурс не найден (обычно ошибка 404) иjava.net.UnknownHostException
если разрешение DNS не удалось; Другие IOException соответствуют ошибкам при передаче.(Помечено как вики сообщества, не стесняйтесь добавлять информацию или исправления)
источник
В библиотеке underscore-java есть метод U.fetch (url) .
pom.xml:
Пример кода:
источник
Java
, но ваш ответ похож наJavaScript
источник
Вы можете сделать это в 1 строку, используя netloader for Java :
источник
Если вы находитесь за прокси, вы можете установить прокси в java программе, как показано ниже:
Если вы не используете прокси-сервер, не включайте приведенные выше строки в ваш код. Полный рабочий код для загрузки файла, когда вы находитесь за прокси.
источник
1-й метод с использованием нового канала
2-й метод с использованием FileUtils
3-й метод с использованием
Вот как мы можем загрузить файл, используя базовый код Java и другие сторонние библиотеки. Это только для справки. Пожалуйста, Google с вышеупомянутыми ключевыми словами, чтобы получить подробную информацию и другие варианты.
источник