Вопрос-ответ

How can I download and save a file from the Internet using Java?

Как я могу загрузить и сохранить файл из Интернета с помощью Java?

Есть онлайн-файл (например, http://www.example.com/information.asp), который мне нужно захватить и сохранить в каталог. Я знаю, что существует несколько методов для построчного получения и чтения онлайн-файлов (URL-адресов), но есть ли способ просто загрузить и сохранить файл с помощью Java?

Переведено автоматически
Ответ 1

Попробуйте Java NIO:

URL website = new URL("http://www.website.com/information.asp");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("information.html");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);

Использование transferFrom() потенциально намного эффективнее, чем простой цикл, который считывает данные из исходного канала и записывает в этот канал. Многие операционные системы могут передавать байты непосредственно из исходного канала в кэш файловой системы, фактически не копируя их.

Подробнее об этом здесь.

Примечание: Третий параметр в transferFrom - это максимальное количество байт для передачи. Integer.MAX_VALUE передаст не более 2 ^ 31 байта, Long.MAX_VALUE допустит не более 2 ^ 63 байт (больше, чем любой существующий файл).

Ответ 2

Используйте Apache Commons IO. Это всего лишь одна строка кода:

FileUtils.copyURLToFile(URL, File)
Ответ 3

Более простое использование неблокирующего ввода-вывода:

URL website = new URL("http://www.website.com/information.asp");
try (InputStream in = website.openStream()) {
Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
}
Ответ 4
public void saveUrl(final String filename, final String urlString)
throws MalformedURLException, IOException {
BufferedInputStream in = null;
FileOutputStream fout = null;
try {
in = new BufferedInputStream(new URL(urlString).openStream());
fout = new FileOutputStream(filename);

final byte data[] = new byte[1024];
int count;
while ((count = in.read(data, 0, 1024)) != -1) {
fout.write(data, 0, count);
}
} finally {
if (in != null) {
in.close();
}
if (fout != null) {
fout.close();
}
}
}

Вам нужно будет обрабатывать исключения, возможно, внешние по отношению к этому методу.

java