Es gibt eine Online-Datei (z. B. http://www.example.com/information.asp
), die ich abrufen und in einem Verzeichnis speichern muss. Ich weiß, dass es mehrere Methoden gibt, um Online-Dateien (URLs) zeilenweise zu erfassen und zu lesen, aber gibt es eine Möglichkeit, die Datei einfach mit Java herunterzuladen und zu speichern?
Probieren Sie Java NIO aus:
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);
Die Verwendung von transferFrom()
ist potentiell viel effizienter als eine einfache Schleife, die vom Quellkanal liest und in diesen Kanal schreibt. Viele Betriebssysteme können Bytes direkt vom Quellkanal in den Dateisystem-Cache übertragen, ohne sie tatsächlich zu kopieren.
Lesen Sie mehr darüber hier.
Anmerkung: Der dritte Parameter in transferFrom ist die maximale Anzahl der zu übertragenden Bytes. Bei Integer.MAX_VALUE
werden maximal 2^31 Bytes übertragen, bei Long.MAX_VALUE
sind maximal 2^63 Bytes möglich (größer als jede existierende Datei).
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();
}
}
}
Sie werden Ausnahmen behandeln müssen, wahrscheinlich außerhalb dieser Methode.
Um eine Datei herunterzuladen, müssen Sie sie lesen. In jedem Fall müssen Sie die Datei auf irgendeine Weise durchgehen. Anstatt Zeile für Zeile können Sie die Datei auch einfach byteweise aus dem Stream lesen:
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);
}