ragazzi come da titolo ho fatto un programma che scarica via ftp dei file.... ma come faccio ad ottenere in tempo reale i mega scaricati?
ragazzi come da titolo ho fatto un programma che scarica via ftp dei file.... ma come faccio ad ottenere in tempo reale i mega scaricati?
Beh ... ma dipende da come/con cosa leggi lo stream di dati!!!Originariamente inviato da Realscorpion
ragazzi come da titolo ho fatto un programma che scarica via ftp dei file.... ma come faccio ad ottenere in tempo reale i mega scaricati?
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
codice:String server="xxxx"; String userName="xxx"; String pw="xxx"; FtpClient ftpClient = new FtpClient(); try { ftpClient.openServer(server); ftpClient.login(userName, pw); ftpClient.cd("/"); ftpClient.binary(); TelnetInputStream netIn = ftpClient.list(); BufferedReader br = new BufferedReader(new InputStreamReader(netIn)); String linea; ArrayList list = new ArrayList(); while ((linea = br.readLine()) != null) { list.add(linea); } int size = list.size(); Object[][] dati = new Object[size][]; for (int i = 0; i < size; i++) { dati[i] = new Object[] { list.get(i) }; }
È la FtpClient quella "non documentata" della Sun in sun.net.ftp???Originariamente inviato da Realscorpion
codice:FtpClient ftpClient = new FtpClient();
Comunque io qui vedo altre cose (login, lista dei file) ma non vedo la parte che proprio fisicamente scarica i dati .....
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
sì sun.net.ftp...Originariamente inviato da andbin
È la FtpClient quella "non documentata" della Sun in sun.net.ftp???
Comunque io qui vedo altre cose (login, lista dei file) ma non vedo la parte che proprio fisicamente scarica i dati .....
per scaricare fisicamente i dati quello lo faccio al doppio click
non avevo capito bene cosa volevi dire con scaricare.. pensavo la lista dei file..codice:public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2){ JTable target = (JTable)e.getSource(); int row = target.getSelectedRow(); int column = target.getSelectedColumn(); String lol=(String)target.getValueAt(row, column); String lol2 = lol.substring(56); JFileChooser chooser = new JFileChooser (); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser.showOpenDialog(null); String file2=(chooser.getSelectedFile().getAbsolutePath()); String server="xxxx"; String userName="xxxx"; String pw="xxxxx"; String fileName=jTextField1.getText(); FtpClient ftpClient = new FtpClient(); try { ftpClient.openServer(server); ftpClient.login(userName, pw); ftpClient.cd("/"); ftpClient.binary(); TelnetInputStream in = ftpClient.get(lol2); FileOutputStream out = new FileOutputStream(file2 + "/" + lol2); int i = 0; byte[] bytesIn = new byte[1024]; while ((i = in.read(bytesIn)) >= 0) { out.write(bytesIn, 0, i); } out.close(); in.close(); }
Innanzitutto partiamo da qui: questa FtpClient è fornita dalla Sun ma è non documentata e non supportata. Oltretutto offre funzionalità solo di "basso" livello. Lo vedi bene anche tu dal fatto che essa ti fornisce la lista dei file in modo molto "crudo" ovvero l'elenco dei file formattato riga x riga proprio come lo fornisce un comando (es. "dir" oppure "ls" su Linux) del sistema operativo. Lasciando a te il compito di "sapere" a quali colonne ci sono i dati di tuo interesse (ed eventualmente convertirli in qualche modo, es. la dimensione).Originariamente inviato da Realscorpion
sì sun.net.ftp...
E il fatto che il formato delle righe dipende fortemente dal sistema operativo dove risiede il server FTP a cui ti colleghi pone limiti e problemi in più. Se ti colleghi al server ftp://pincopalla.com che usa Unix, il formato delle righe è di un certo tipo. Se ti colleghi ad un server ftp://tiziocaio.com che usa Windows, il formato delle righe è ancora un altro ben differente.
Morale della favola: se questo programmino lo stai facendo per esercizio "didattico", per tuo uso e basta o poco più .... ok va bene. Se intendi fare qualcosa di un po' più serio, magari da distribuire ... allora dimentica la FtpClient della Sun e orientati su qualche altra libreria di FTP client più seria e "robusta" (nonché documentata e supportata).
Purtroppo è molto sbagliato, sotto diversi punti di vista.Originariamente inviato da Realscorpion
per scaricare fisicamente i dati quello lo faccio al doppio click
Innanzitutto tutto questo codice lo esegui direttamente a seguito di un evento, ovvero sei nel contesto del EDT. La operazione di login e ancora di più quella di download è potenzialmente lenta/lunga. E visto che stai tenendo tu impegnato il EDT, questo comporta il fatto che tutta la tua interfaccia utente è praticamente "congelata" ... non responsiva.
È la solita questione del threading in Swing .... di cui ormai ne parlo sul forum con cadenza quasi settimanale!!
L'altro punto dolente del tuo codice è proprio la scrittura e struttura del codice. In quella trentina di righe fai tutto quanto mescolato insieme: gestione dell'evento, scelta del file, connessione e login al server, lettura dal server, scrittura su file ecc...
Non vedo nemmeno una valida/seria gestione delle eccezioni.
No, non va bene. Non mi stancherò mai di ripeterlo: spezza, incapsula, separa e ancora incapsula!!! La programmazione ad oggetti serve per questo .... non per scrivere una accozzaglia di roba tutta mescolata e impastata insieme, che A) non si capisce nulla e B) è poco gestibile/manutenibile!!!!
E poi infine ... quale è la difficoltà nel determinare, durante la progressione del download, la quantità di byte scaricata fino a quel momento??? Tu dal server leggi tanti pezzetti della risorsa remota, lo fai in un ciclo in cui con la read() leggi un tot (max 1024) di byte per volta.
Tieni una variabile inizialmente a 0 e ad ogni ciclo aggiungi ciò che ritorna la read(). Quella è la dimensione scaricata fino a quel momento!!!!
P.S. no, mi dispiace dirlo ... così il codice non va.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet