Υπάρχει ένα online αρχείο (όπως το http://www.example.com/information.asp
) που πρέπει να αρπάξω και να αποθηκεύσω σε έναν κατάλογο. Γνωρίζω ότι υπάρχουν διάφορες μέθοδοι για την αρπαγή και ανάγνωση online αρχείων (URL) γραμμή προς γραμμή, αλλά υπάρχει τρόπος να κατεβάσω και να αποθηκεύσω το αρχείο χρησιμοποιώντας τη Java;
Δοκιμάστε το 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()
είναι ενδεχομένως πολύ πιο αποδοτική από έναν απλό βρόχο που διαβάζει από το κανάλι προέλευσης και γράφει σε αυτό το κανάλι. Πολλά λειτουργικά συστήματα μπορούν να μεταφέρουν bytes απευθείας από το κανάλι πηγής στην κρυφή μνήμη του συστήματος αρχείων χωρίς να τα αντιγράφουν στην πραγματικότητα.
Δείτε περισσότερα σχετικά με αυτό εδώ.
Σημείωση: Η τρίτη παράμετρος στο transferFrom είναι ο μέγιστος αριθμός bytes που θα μεταφερθούν. Το Integer.MAX_VALUE
θα μεταφέρει το πολύ 2^31 bytes, το Long.MAX_VALUE
θα επιτρέψει το πολύ 2^63 bytes (μεγαλύτερο από οποιοδήποτε αρχείο υπάρχει).
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();
}
}
}
Θα χρειαστεί να χειριστείτε τις εξαιρέσεις, πιθανώς εξωτερικά αυτής της μεθόδου.
Η λήψη ενός αρχείου απαιτεί να το διαβάσετε, είτε έτσι είτε αλλιώς θα πρέπει να περάσετε από το αρχείο με κάποιο τρόπο. Αντί να το διαβάζετε γραμμή προς γραμμή, μπορείτε απλώς να το διαβάζετε ανά bytes από τη ροή:
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);
}