C'è un file online (come http://www.example.com/information.asp
) che devo prendere e salvare in una directory. So che ci sono diversi metodi per afferrare e leggere i file online (URL) riga per riga, ma c'è un modo per scaricare e salvare il file usando Java?
Provate 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);
Usare transferFrom()
è potenzialmente molto più efficiente di un semplice ciclo che legge dal canale sorgente e scrive su questo canale. Molti sistemi operativi possono trasferire byte direttamente dal canale sorgente nella cache del filesystem senza copiarli effettivamente.
Controllate meglio qui.
Nota: Il terzo parametro in transferFrom è il numero massimo di byte da trasferire. Integer.MAX_VALUE
trasferirà al massimo 2^31 byte, Long.MAX_VALUE
permetterà al massimo 2^63 byte (più grande di qualsiasi file esistente).
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();
}
}
}
Avrete bisogno di gestire le eccezioni, probabilmente esterne a questo metodo.
Scaricare un file richiede di leggerlo, in entrambi i casi dovrete passare attraverso il file in qualche modo. Invece che riga per riga, puoi semplicemente leggerlo per byte dal flusso:
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);
}