Java kullanarak İnternet'ten bir dosya nasıl indirilir ve kaydedilir?

Almam ve bir dizine kaydetmem gereken çevrimiçi bir dosya (örneğin http://www.example.com/information.asp) var. Çevrimiçi dosyaları (URL'ler) satır satır yakalamak ve okumak için çeşitli yöntemler olduğunu biliyorum, ancak dosyayı Java kullanarak indirmenin ve kaydetmenin bir yolu var mı?

Çözüm

Java NIO]1'yu bir deneyin:

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()`u kullanmak, kaynak kanaldan okuyan ve bu kanala yazan basit bir döngüden potansiyel olarak çok daha verimlidir. Birçok işletim sistemi baytları kopyalamadan doğrudan kaynak kanaldan dosya sistemi önbelleğine aktarabilir.

Bu konuda daha fazla bilgi edinin burada.

Not: transferFrom'daki üçüncü parametre, aktarılacak maksimum bayt sayısıdır. Integer.MAX_VALUEen fazla 2^31 bayt aktarır,Long.MAX_VALUE` en fazla 2^63 bayta izin verir (var olan herhangi bir dosyadan daha büyük).

Yorumlar (23)
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();
        }
    }
}

Muhtemelen bu yöntemin dışında istisnaları ele almanız gerekecektir.

Yorumlar (8)

Bir dosyayı indirmek onu okumanızı gerektirir, her iki durumda da dosyayı bir şekilde gözden geçirmeniz gerekecektir. Satır satır okumak yerine, akıştan bayt bayt okuyabilirsiniz:

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);
    }
Yorumlar (0)