Как скачать и сохранить файл из Интернета с помощью Java? - PullRequest
406 голосов
/ 28 мая 2009

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

Ответы [ 20 ]

541 голосов
/ 28 мая 2009

Дайте 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 байта (больше, чем любой существующий файл).

472 голосов
/ 23 августа 2011

Используйте apache commons-io , только один код строки:

FileUtils.copyURLToFile(URL, File)
117 голосов
/ 04 июня 2014

Упрощенное использование nio:

URL website = new URL("http://www.website.com/information.asp");
try (InputStream in = website.openStream()) {
    Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
}
85 голосов
/ 28 мая 2009
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();
        }
    }
}

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

23 голосов
/ 28 мая 2009

Для загрузки файла вам необходимо прочитать его, в любом случае вам придется каким-то образом просматривать файл. Вместо того, чтобы построчно, вы можете просто прочитать его байтами из потока:

BufferedInputStream in = new BufferedInputStream(new URL("http://www.website.com/information.asp").openStream())
    byte data[] = new byte[1024];
    int count;
    while((count = in.read(data,0,1024)) != -1)
    {
        out.write(data, 0, count);
    }
19 голосов
/ 01 декабря 2017

Это старый вопрос, но вот краткое, читаемое, JDK-решение с правильно закрытыми ресурсами:

public static void download(String url, String fileName) throws Exception {
    try (InputStream in = URI.create(url).toURL().openStream()) {
        Files.copy(in, Paths.get(fileName));
    }
}

Две строки кода и никаких зависимостей.

17 голосов
/ 02 февраля 2015

При использовании Java 7+ используйте следующий метод для загрузки файла из Интернета и сохранения его в каком-либо каталоге:

private static Path download(String sourceURL, String targetDirectory) throws IOException
{
    URL url = new URL(sourceURL);
    String fileName = sourceURL.substring(sourceURL.lastIndexOf('/') + 1, sourceURL.length());
    Path targetPath = new File(targetDirectory + File.separator + fileName).toPath();
    Files.copy(url.openStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);

    return targetPath;
}

Документация здесь .

15 голосов
/ 28 ноября 2014

Этот ответ почти точно такой же, как выбранный ответ, но с двумя улучшениями: это метод, и он закрывает объект FileOutputStream:

    public static void downloadFileFromURL(String urlString, File destination) {    
        try {
            URL website = new URL(urlString);
            ReadableByteChannel rbc;
            rbc = Channels.newChannel(website.openStream());
            FileOutputStream fos = new FileOutputStream(destination);
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
            fos.close();
            rbc.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
10 голосов
/ 21 апреля 2013
import java.io.*;
import java.net.*;

public class filedown {
    public static void download(String address, String localFileName) {
        OutputStream out = null;
        URLConnection conn = null;
        InputStream in = null;

        try {
            URL url = new URL(address);
            out = new BufferedOutputStream(new FileOutputStream(localFileName));
            conn = url.openConnection();
            in = conn.getInputStream();
            byte[] buffer = new byte[1024];

            int numRead;
            long numWritten = 0;

            while ((numRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, numRead);
                numWritten += numRead;
            }

            System.out.println(localFileName + "\t" + numWritten);
        } 
        catch (Exception exception) { 
            exception.printStackTrace();
        } 
        finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            } 
            catch (IOException ioe) {
            }
        }
    }

    public static void download(String address) {
        int lastSlashIndex = address.lastIndexOf('/');
        if (lastSlashIndex >= 0 &&
        lastSlashIndex < address.length() - 1) {
            download(address, (new URL(address)).getFile());
        } 
        else {
            System.err.println("Could not figure out local file name for "+address);
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            download(args[i]);
        }
    }
}
8 голосов
/ 28 мая 2009

Лично я обнаружил, что HttpClient Apache более чем способен ко всему, что мне нужно сделать в связи с этим. Здесь - отличный учебник по использованию HttpClient

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