Reikia paimti ir į katalogą įrašyti internetinį failą (pvz., http://www.example.com/information.asp
). Žinau, kad yra keletas metodų, kaip paimti ir skaityti internetinius failus (URL) eilutė po eilutės, bet ar yra būdas tiesiog atsisiųsti ir išsaugoti failą naudojant "Java"?
Išbandykite 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);
Naudojant transferFrom()
yra potencialiai daug efektyvesnis nei paprastas ciklas, kuris skaito iš šaltinio kanalo ir rašo į šį kanalą. Daugelis operacinių sistemų gali perkelti baitus tiesiai iš šaltinio kanalo į failų sistemos talpyklą, faktiškai jų nekopijuodamos.
Plačiau apie tai skaitykite čia.
Pastaba: Trečiasis parametras transferFrom yra didžiausias perduodamų baitų skaičius. Naudojant Integer.MAX_VALUE
bus perduota ne daugiau kaip 2^31 baitas, o naudojant Long.MAX_VALUE
- ne daugiau kaip 2^63 baitai (didesni už bet kurį egzistuojantį failą).
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();
}
}
}
Turėsite tvarkyti išimtis, tikriausiai išorines šiam metodui.
Atsisiunčiant failą reikia jį perskaityti, bet kuriuo atveju turėsite kokiu nors būdu peržiūrėti failą. Užuot skaitę eilutę po eilutės, galite tiesiog skaityti jį baitais iš srauto:
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);
}