Hay un archivo en línea (como http://www.example.com/information.asp
) que necesito agarrar y guardar en un directorio. Sé que hay varios métodos para agarrar y leer archivos en línea (URLs) línea por línea, pero ¿hay una manera de simplemente descargar y guardar el archivo usando Java?
Pruebe 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);
El uso de transferFrom()
es potencialmente mucho más eficiente que un simple bucle que lee desde el canal de origen y escribe en este canal. Muchos sistemas operativos pueden transferir bytes directamente desde el canal de origen a la caché del sistema de archivos sin tener que copiarlos.
Consulta más sobre esto aquí.
Nota: El tercer parámetro en transferFrom es el número máximo de bytes a transferir. Integer.MAX_VALUE
transferirá como máximo 2^31 bytes, Long.MAX_VALUE
permitirá como máximo 2^63 bytes (más grande que cualquier archivo existente).
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();
}
}
}
Tendrá que manejar excepciones, probablemente externas a este método.
Descargar un archivo requiere que lo leas, de cualquier manera tendrás que recorrer el archivo de alguna manera. En lugar de línea por línea, puedes leerlo por bytes desde el stream:
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);
}