Hvordan downloader og gemmer man en fil fra internettet ved hjælp af Java?

Der er en online-fil (f.eks. http://www.example.com/information.asp), som jeg skal hente og gemme i en mappe. Jeg ved, at der findes flere metoder til at hente og læse online-filer (URL'er) linje for linje, men er der en måde, hvorpå jeg bare kan hente og gemme filen ved hjælp af Java?

Løsning

Prøv 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);

Brug af transferFrom() er potentielt meget mere effektivt end en simpel sløjfe der læser fra kildekanalen og skriver til denne kanal. Mange operativsystemer kan overføre bytes direkte fra kildekanalen ind i filsystemets cache uden faktisk at kopiere dem.

Se mere om det her.

Note: Den tredje parameter i transferFrom er det maksimale antal bytes, der skal overføres. Integer.MAX_VALUE vil overføre højst 2^31 bytes, Long.MAX_VALUE vil tillade højst 2^63 bytes (større end enhver eksisterende fil).

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

Du skal håndtere undtagelser, sandsynligvis eksternt til denne metode.

Kommentarer (8)

Hvis du downloader en fil, skal du læse den, og du skal på en eller anden måde gennemgå filen. I stedet for at læse den linje for linje kan du bare læse den bytesvis fra strømmen:

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