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?
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).
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.
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);
}