2016-09-28 3 views
0

J'ai une classe qui copie un fichier d'un dossier à un autre:obtenir la position au canal de fichier

public class Foo extends JFrame{ 
    Timer t; 
    FileChannel inp = null, 
       outp= null; 
    File sourceFile = new File("C:/movies/movie.mkv"), 
      destFile = new File("C:/test/movie.mkv"); 
    long rec = 0; 
    long size; 
    LayoutManager manager = new MigLayout(); 
    public void createUI(){ 
     JPanel panel = new JPanel(); 
     JButton copyFile = new JButton("Copy file"); 
     JButton btn = new JButton("Start function"); 
     JButton stop = new JButton("Stop function"); 
     panel.setLayout(manager); 
     panel.add(btn); 
     panel.add(copyFile,"wrap"); 
     panel.add(stop); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setContentPane(panel); 
     this.setVisible(true); 
     this.setSize(400,400); 
     this.pack(); 
     btn.addActionListener((e)->{ 

      try { 
       inp = new FileInputStream(sourceFile).getChannel(); 
       outp = new FileOutputStream(destFile).getChannel(); 
       size = inp.size(); 
       outp.transferFrom(inp,0,size); 
      } catch (Exception e2) { 
       // TODO Auto-generated catch block 
       System.out.println("FIle not found"); 
       return; 
      } 
      t = new Timer(100,i->{ 
       try { 
        rec = outp.position(); 
       } catch (Exception e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
        rec = 0;     
       } 
       finally{ 
        System.out.println("Position in file:"+rec); 
       } 
      }); 
      t.start(); 
     }); 

    } 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(()->new Foo().createUI()); 
    } 
} 

Maintenant, j'ai une minuterie Swing que toutes les 100ms sorties de la position dans le fichier. Ce que j'essaie réellement de faire est de faire savoir à l'utilisateur quelle partie du fichier a été copiée. Le problème est que toutes les 100ms le numéro qui est sorti dans ma console est "Position dans le fichier: 126089692".

Je voudrais une explication si possible.

Merci pour votre temps

Répondre

0

Il est parce que vous devez d'abord copier le fichier entier (outp.transferFrom(inp,0,size);), puis démarre la temporisation - alors que le travail est déjà fait. Essayez de démarrer la minuterie avant le transfert de données réel.

+0

je l'ai essayé, mais avait le même résultat –

0

La méthode transferFrom n'est pas exécutée de manière asynchrone. Il est déjà terminé lorsque votre minuterie commence. Envisagez de déplacer la partie try..catch (transfert de fichier) vers un thread propre, démarrez d'abord le temporisateur, puis le thread de transfert.

Et BTW: un intervalle de 100 ms est beaucoup trop rapide pour une interface graphique. L'incrémentation de toutes les secondes ou demi-secondes est plus que suffisant.

+0

Merci pour votre point.I essayé ce que vous avez fait, mais ne manquant pas du tout –

1

Je trouve dans https://docs.oracle.com/javase/8/docs/api/:

public abstract long transferFrom(ReadableByteChannel src, 
           long position, 
           long count) 
         throws IOException- 

« ... Cette méthode ne modifie pas la position de ce canal ... »

Peut-être est la raison pour laquelle vous voyez la même valeur (je ne l'ai pas vérifie ça).

Essayez de remplacer:

rec = outp.position(); 

par

rec = inp.position(); 
+0

semble raisonnable – Antoniossss