450 votos

¿Cómo descargar y guardar un archivo de Internet usando Java?

Hay un archivo en línea (como http://www.example.com/information.asp ) tengo que tomar y guardar en un directorio. ¿Sé que existen varios métodos para agarrar y leyendo en Internet archivos (URL) línea por línea, pero hay una manera de bajar y guardar el archivo usando Java?

573voto

dfa Puntos 54490

Darle una oportunidad a 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);

Utilizando transferFrom() es potencialmente mucho más eficiente que un simple bucle que lee desde el canal de origen y escribe a este canal. Muchos sistemas operativos pueden transferir bytes directamente desde el canal de origen en el sistema de ficheros de la caché sin tener que copiar de ellos.

Consulte más sobre él aquí.

Nota: El tercer parámetro en transferFrom es el número máximo de bytes a transferir. Integer.Max_VALUE serán transferidos a la mayoría de los 2^31 bytes, Long.MAX_VALUE permitirá en la mayoría de los 2^63 bytes (más grande que cualquier archivo en existencia).

518voto

Uso de apache commons-io, una sola línea de código:

org.apache.commons.io.FileUtils.copyURLToFile(URL, File)

125voto

xuesheng Puntos 541

Uso de nio más simple:

URL website = new URL("http://www.website.com/information.asp");
Files.copy(website.openStream(), target, StandardCopyOption.REPLACE_EXISTING);

86voto

Ben Noland Puntos 10060
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();
        }
    }
}

Usted necesitará controlar excepciones, probablemente externas a este método.

23voto

z - Puntos 5610

Descargando un archivo requiere que lo leas, de cualquier manera que tendrá que pasar por el archivo de alguna manera. En lugar de línea por línea, sólo se puede leer por bytes de la secuencia:

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);
    }

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X