Come sostituire un Vector compatibile con ChannelSftp?

di ZioCrick il
7 risposte

Buongiorno a tutti.

Ho una domandina.

In passato ho realizzato un programma per fare delle copie di file tra pc in LAN e per ottenere l'elenco dei file di una cartella remota uso:

   ChannelSftp chanSftp = (ChannelSftp) channel;
   Vector<ChannelSftp.LsEntry> files;
   files = chanSftp.ls(sPath);

Siccome ora NetBeans mi dice che Vector è obsoleto mi piacerebbe sostituirlo con qualcosaltro.

Ho provato con un: 

   ArrayList<ChannelSftp.LsEntry> files; 
   files = chanSftp.ls(sPath);

ma sulla chanSftp.ls mi da errore di incompatibilità tra il Vector e la ArrayList.
Penso che sia perché probabilmente chanSftp.ls genera un Vector.

Qualche idea per risolvere la situazione?

7 Risposte

  • Non c'è modo di "risolvere": la libreria, piuttosto datata, utilizza Vector come classe di ritorno per quel metodo e chi la utilizza è costretto ad adeguarsi.

    Quello che puoi fare, per evitare il warning in compilazione, è utilizzare l'annotazione @SuppressWarnings("deprecation"):

    @SuppressWarnings("deprecation")
    Vector<ChannelSftp.LsEntry> files = chanSftp.ls(sPath);

    In questo modo stai dicendo al compilatore "sono consapevole che sto utilizzando una classe che è stata marchiata come deprecata, quindi non generare l'avviso relativo"

  • 25/08/2026 - SpiritoLibero ha scritto:

    Non c'è modo di "risolvere": la libreria, piuttosto datata, utilizza Vector come classe di ritorno per quel metodo e chi la utilizza è costretto ad adeguarsi.

    Eh, amico caro, in effetti speravo che qualcuno avesse da indicarmi un'alternativa a ChannelSftp, perché quando ho realizzato il programma sono diventato matto a cercare soluzioni per fare copie tra pc e i NAS e tra pc e pc e non avevo trovato altro. 

    Quello che puoi fare, per evitare il warning in compilazione, è utilizzare l'annotazione @SuppressWarnings("deprecation"):

    @SuppressWarnings("deprecation")
    Vector<ChannelSftp.LsEntry> files = chanSftp.ls(sPath);

    In questo modo stai dicendo al compilatore "sono consapevole che sto utilizzando una classe che è stata marchiata come deprecata, quindi non generare l'avviso relativo"

    Si questo lo sapevo, ma per miei gusti personali, preferirei trovare soluzioni che evitino l'insorgere di questi tipi di segnalazioni. ;-)

  • Se intendi cambiare libreria, ce ne sono diverse di alternative:

    Apache Mina SSHD:

    E' scritta e manutenuta dalla Apache, quindi è costantemente aggiornata e, di solito, è sempre roba robusta ed efficiente. E' una libreria che permette di gestire i protocolli SSH e SFTP. Al solito, quando si ha a che fare con questo tipo di protocolli non è semplicissimo fornire alti livelli di astrazione mantenendo robustezza e efficienza, quindi la libreria ha una API un po' verbosa.

    SSHJ di hierynomus:

    Anche questa è una libreria che viene mantenuta aggiornata. L'API dovrebbe essere un pochino meno verbosa rispetto a quella di Apache. Essendo aggiornata supporta nativamente chiavi SSH moderne.

    Apache Commons VFS:

    Secondo me questa dovrebbe fare al caso tuo: è una libreria che fornisce un'API comune per l'accesso a file system locali, remoti (SFTP, FTP, HTTP) e compressi ZIP. Si porta dietro, ovviamente, delle librerie apposite per i vari tipi di accesso, ma astrae il tutto conformandolo ad un'unica API. E' sempre di Apache Software, quindi garanzia di affidabilità e robustezza.

    Tengo a precisare che non ho mai usato nessuna di quelle di Apache, ma fossi in te le terrei in considerazione e farei qualche prova.

  • 25/08/2026 - SpiritoLibero ha scritto:

    Se intendi cambiare libreria, ce ne sono diverse di alternative:

    Urca! Grazie mille caro. ;-)
    Mi sento per l'ennesima volta decisamente rinco...  io all'epoca non le ho trovate. :-(

    Mi metto subito a cercare di capire come funziona la Apache Commons VFS.

  • Eccomi di nuovo nel marasma!

    Ho trovato in rete un esempio di utilizzo di Apache Commons VFS, l'ho riprodotto con qualche semplificazione. Questo è il sorgente

    package vfs;
    import java.text.DateFormat;
    import java.util.Date;
    import org.apache.commons.vfs2.FileObject;
    import org.apache.commons.vfs2.FileSystemManager;
    import org.apache.commons.vfs2.FileType;
    import org.apache.commons.vfs2.VFS;
    
    public class Vfs {
      private static final int SHOW_MAX = 5;
    
      public static void main(String[] args) throws org.apache.commons.vfs2.FileSystemException {
        if (args.length == 0) {
          System.err.println("Please pass the name of a file as parameter.");
          System.err.println("e.g. java org.apache.commons.vfs2.example.ShowProperties LICENSE.txt");
          return;
        }
        for (String arg : args) {
          if (arg.length() == 0) break;
          FileSystemManager mgr = VFS.getManager();
          System.out.println();
          System.out.println("Parsing: " + arg);
          FileObject file = mgr.resolveFile(arg);
          if (file.exists()) {
            System.out.println("URL: " + file.getURL());
            System.out.println("getName(): " + file.getName());
            System.out.println("BaseName: " + file.getName().getBaseName());
            System.out.println("Extension: " + file.getName().getExtension());
            System.out.println("Path: " + file.getName().getPath());
            System.out.println("Root path: " + file.getFileSystem().getRoot().getName().getPath());
            if (file.getType().equals(FileType.FILE)) {
              System.out.println("Size: " + file.getContent().getSize() + " bytes");
            } else if (file.getType().equals(FileType.FOLDER) && file.isReadable()) {
              final FileObject[] children = file.getChildren();
              System.out.println("Directory with " + children.length + " files");
              for (int iterChildren = 0; iterChildren < children.length; iterChildren++) {
                System.out.println("#" + iterChildren + ": " + children[iterChildren].getName());
                if (iterChildren > SHOW_MAX) break;
              }
            }
            System.out.println("Last modified: " + DateFormat.getInstance().format(new Date(file.getContent().getLastModifiedTime())));
          } else {
            System.out.println("The file does not exist");
          }
          file.close();
        }
      }
    }
    

    ma sulla FileSystemManager mgr = VFS.getManager(); mi da l'errore:
    Exception in thread "main" org.apache.commons.vfs2.FileSystemException: Could not create a file system manager of class "org.apache.commons.vfs2.impl.StandardFileSystemManager".

    e anche in questo caso non capisco da cosa derivi.
    Preciso che il path del file che passo come argomento (arg) è su un disco locale del pc su cui gira il programma.

    Qualche dritta?

  • Prova a verificare se c'è un'eccezione più specifica (di solito viene elencata dopo con la dicitura "Caused by:"). Probabilmente manca una parte della libreria (come detto, Apache Commons VFS fornisce un'interfaccia comune, ma sotto sotto si porta dietro altre librerie per l'accesso ai file systems).

    Io ho provato a creare un progetto nuovo (Maven) indicando come dipendenza solo questo:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-vfs2</artifactId>
        <version>2.10.0</version>
        <scope>compile</scope>
    </dependency>

    E sono stati portati dentro questi quattro file:

    • commons-io-2.18.0.jar
    • commons-lang3-3.17.0.jar
    • commons-logging-1.3.4.jar
    • commons-vfs2-2.10.0.jar

    Poi ho copincollato il tuo codice e a me funziona senza problemi:

  • 27/08/2026 - SpiritoLibero ha scritto:

    E sono stati portati dentro questi quattro file:

    • commons-io-2.18.0.jar
    • commons-lang3-3.17.0.jar
    • commons-logging-1.3.4.jar
    • commons-vfs2-2.10.0.jar

    Poi ho copincollato il tuo codice e a me funziona senza problemi:

    Carissimo non finirò mai di ringraziarti! Sei un mito! :-))
    Ho scaricato i primi 3 file che hai indicato perché nel pacchetto che avevo scaricato, oltre a commons-vfs2-2.10.0.jar c'era un mucchio di altra roba ma non quelli.
    Li ho messi nella library che avevo creato in NetBeans e ha funzionato!!!!!
    Io non ho mai usato Maven ma sempre e solo Ant, per cui non me li ha aggiunti automaticamente.

    Adesso cerco di trovare altri esempi per la copia e la cancellazione dei file.
    Qualsiasi indicazione è la benvenuta. ;-)

Devi accedere o registrarti per scrivere nel forum
7 risposte