ciao, volevo sapere se è possibile fare una cosa del genere:
dato un url di un file, scaricarlo in automatico (senza che esca la finestra "salva, apri, annulla") in un path che decido io!
![]()
ciao, volevo sapere se è possibile fare una cosa del genere:
dato un url di un file, scaricarlo in automatico (senza che esca la finestra "salva, apri, annulla") in un path che decido io!
![]()
stex1984
Quale applicazione dovrebbe fare questo?
Una classica applicazione a finestre? Un applet? Una pagina Web?
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...
a me interessa semplicemente che lanciando il main, anche da console, il programma scarica un file che si trova su internet e lo salva in una directory...
stex1984
Qualcosa del tipo
codice:File localFile = new File("percorso/nome_file"); try { BufferedInputStream bis = new BufferedInputStream((new URL("url_file")).openStream(), 4096); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(localFileName), 4096); byte[] buf=new byte[4096]; int byteRead; while ((byteRead=bis.read(buf,0,4096))>=0) { bos.write(buf,0,byteRead); } bis.close(); bos.flush(); bos.close(); } catch (Exception e) { System.out.println(e.toString()); }
<´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
"The answer to your question is: welcome to tomorrow"
beh, direi ottimo!!!!! grazie!!!![]()
ora voglio esagerare...
si può modificare il codice in modo tale che il file venga scaricato da più thread?
mi spiego... hai presente i download manager che attivano più thread per scaricare più velocemente il file? ecco!! intendo questo!
si può fare?
![]()
stex1984
Eh, non lo so, non ci avevo mai pensato... il fatto è che quel codice l'ho utilizzato per scaricare una piccola quantità di piccoli file e non ho mai pensato a come ottimizzare la cosa per grandi file... se ho un po' di tempo libero nel prossimo fine settimana ci penso su... se nel frattempo ne vieni a capo tu, posta la soluzione per i posteri![]()
<´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
"The answer to your question is: welcome to tomorrow"
Ancora meglio... vedi se questo ti piace
http://users.csc.tntech.edu/~jley/csc3700/
<´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
"The answer to your question is: welcome to tomorrow"
mmm... davvero interessante!!! ma forse un po' complicatuccio da capire...(non sono un grande javaman!!!)... grazie cmq!!! :maLOL:
senti... quel 4096 del tuo codice cosa indica?
![]()
stex1984
4096 è la dimensione in bytes del buffer da utilizzare... puoi fare esperimenti e provare ad aumentarlo un po'... vedi se cambiano le prestazioni (cambi sostanziali) o se invece scarichi file corrotti.
<´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
"The answer to your question is: welcome to tomorrow"
Allora, prima che ti ci rompi la testa sopra, la tecnica generale NON è skippare bytes sul BufferedInputStream... ma creare una URLConnection e mandare i giusti parametri alla connessione. Per esempio
e quindi creando il bufferedInputStream su uc (che è URLConnection) con, ad esempiocodice:uc = url.openConnection(); initByte = fileSize/totalsegments*segment; endByte = fileSize/totalsegments*(segment+1) -1; uc.setRequestProperty("Range", "bytes="+initByte+"-"+endByte);
ottieni di fargli leggere il file a pezzi secondo il numero di segmenti (totalsegments) e il segmento corrente (segment da 0 a n-1)codice:BufferedInputStream bis = new BufferedInputStream(uc.getInputStream(), 4096);
Lascio a te il come ricomporre il tutto in un unico file (suppongo con RandomAccessFile).
Ciao.
<´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
"The answer to your question is: welcome to tomorrow"