IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

FileChannel : interrompre un transferFrom / transferTo


Sujet :

Entrée/Sortie Java

  1. #1
    eks
    eks est déconnecté
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut FileChannel : interrompre un transferFrom / transferTo
    Hello,

    J'utilise, pour la copie de fichiers potentiellement très gros, des FileChannel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			in = new FileInputStream(source).getChannel();
    			out = new FileOutputStream(dest).getChannel();
    			pos = out.transferFrom(in, 0, in.size());
    Le problème vient lorsque j'essaye d'annuler l'opération en cours.
    Je précise que je n'ai effectué mes tests que sous Windows (XP en l'occurence), il se peut que le problème ne se pose pas sur les autres OS.
    J'ai essayé (entre autres), depuis un autre thread :
    • de fermer les channels avec close()
    • de fermer les FileInputStream et FileOutputStream d'où sont issus les channels
    • de lancer une interruption sur le thread effectuant la copie
    • le cradissime stop() sur le thread effectuant la copie
    • le tout avec et sans lock sur le channel de sortie

    mais rien à faire, le transfert continue jusqu'au bout.
    Tout se passe comme si il délèguait au système (en l'occurence au DMA) la tâche de copier le fichier et attendait sagement qu'il ai fini pour retourner, ou presque.
    En effet, le thread effectuant la copie, tout comme celui essayant de faire un close(), stop() ou interrupt() se bloquent jusqu'à ce que la copie soit bien avancée, puis continuent d'un seul coup. Le système n'a alors pas encore fini la copie (si on essaye de voire le fichier dans l'explorateur, ce dernier freeze, il faut attendre quelques secondes que la copie se termine pour qu'il réagisse de nouveau).

    Comment faire pour interrompre proprement mais immédiatement cette copie ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Tout se passe comme si il délèguait au système (en l'occurence au DMA) la tâche de copier le fichier et attendait sagement qu'il ai fini pour retourner, ou presque.
    C'est ce qu'a l'air de dire la javadoc

    Peut être peux tu faire des copies par morceau, ce qui te permettrai d'ajouter des points de controles et d'arreter la copie en cours.
    En bref, quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    nbCopied = 0;
    nbToCopy = 1000*10;
    while (nbCopied<size && !cancelled) {
            pos = out.transferFrom(in, nbCopied , nbToCopy);
            nbCopied+=pos;       
    }

  3. #3
    eks
    eks est déconnecté
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sanguko
    Peut être peux tu faire des copies par morceau, ce qui te permettrai d'ajouter des points de controles et d'arreter la copie en cours.
    Effectivement c'est ce que je fais pour l'instant (bien obligé), mais je ne sais quel impact cela a sur les performances, ni comment trouver le bon équilibre entre réactivité et performance de copie, sachant que tout varie selon la vitesse et l'unicité du ou des supports de lecture/écriture...

Discussions similaires

  1. [Thread] Interrompre un Thread
    Par Arnaud51 dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 13/03/2005, 21h41
  2. [ServerSocket] interrompre la methode accept
    Par benratti dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/03/2005, 10h24
  3. Interrompre une connexion ?
    Par BoBoToTo dans le forum Bases de données
    Réponses: 7
    Dernier message: 29/10/2004, 09h26
  4. [Turbo Pascal] Lire une touche au clavier sans interrompre le programme
    Par Allelouia dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 29/03/2003, 22h31
  5. [VB6] Interrompre toutes procédures
    Par lutin_vert dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/09/2002, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo