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

avec Java Discussion :

Pb pour liberer les ressources


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut Pb pour liberer les ressources
    Bonjour,

    comme dit dans le titre je cherche à supprimer un fichier précédemment
    chargé dans un byteBuffer.

    J'utilise l'API PDF Renderer qui nécessite de charger le fichier dans un byteBuffer mais impossible de libérer la ressource ensuite

    Voila un exemple de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    import java.io.File;
    import java.io.RandomAccessFile;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
     
    public class Main
    {
        public static void main(String[] args)
        {
            RandomAccessFile raf = null ; FileChannel channel = null;  ByteBuffer buf = null;
     
                try {
                raf = new RandomAccessFile(new File("c:/azerty.pdf"), "r");
                channel = raf.getChannel();
                buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
     
                raf.close();
                channel.close();
                System.out.println(buf.hasRemaining());
            } catch (Exception e) {
            }
     
            boolean a = new File("c:/azerty.pdf").delete();
            System.out.println(a);
        }
    }
    J'ai essayé buf = null;, buf.rewind();, buf.remaining(); mais aucun ne fait effet
    Si je supprime la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
    le fichier se supprime

    Une Idée ???

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new File("c:/azerty.pdf").delete();
    par exemple.

    Si tu supprime la ligne, je crois surtout que le fichier ne se crée pas, pas qu'il se supprimer


    PS: retirer ce catch Exception, c'est mauvais pour tout un tas de raison (capture trop large, pas de gestion dans le catch, disparition des messages d'erreur)

  3. #3
    Membre éclairé Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut
    Merci de me répondre comme à chaque fois

    J'ai modifié le code qui est en fait un code test pour savoir la ou ca bloque quand je veux supprimer le fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public class Main
    {
        public static void main(String[] args)
        {
            try {
                File fichier = new File("c:/azerty.pdf");
                RandomAccessFile raf = new RandomAccessFile(fichier, "r");
                FileChannel channel = raf.getChannel();
                ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
     
                raf.close(); channel.close(); buf.clear();
                boolean a = fichier.delete(); System.out.println(a);
     
                File fichier2 = new File("c:/azerty2.pdf");
                RandomAccessFile raf2 = new RandomAccessFile(fichier2, "r");
                FileChannel channel2 = raf2.getChannel();
                buf = channel2.map(FileChannel.MapMode.READ_ONLY, 0, channel2.size());
     
                System.gc();
                a = fichier.delete(); System.out.println(a);
            }
            catch (IOException ex) {    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); }
        }
    }
    Apparemment le pb se situe au niveau de byteBuffer. Je n'arrive pas à libérer la ressource, donc pas à supprimer mon fichier. Si je charge un autre fichier dans le byteBuffer et si et seulement si je lance le garbage collector manuellement, il me le supprime.

    Comment faire pour libérer proprement un byteBuffer?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    D'après la JavaDoc de FileChannel.map(), on ne peut pas libérer proprement un ByteBuffer obtenu avec. Il sera libéré quand il sera garbage-collecté.
    Une histoire de spécificité des OS, si j'ai bien compris.

    J'ai bien peur qu'il ne reste qu'à essayer, genre toutes les minutes, de supprimer le fichier mappé, jusqu'à ce que ça marche. Un peu ch*ant je le reconnais, mais en implémentant un service qui se charge de gérer tout ça, c'est jouable.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut
    Ok je te remercie pour ta réponse

    C'était ce que j'avais vu que l'on ne pouvait pas libérer proprement un byteBuffer.

    Par contre je ne vois pas trop comment je pourrais réaliser un service s'occuppant de ça.

    Est ce que je dois charger un autre fichier dans le byteBuffer?
    Créer un timer?

    Si tu as un bout de code ou un exemple pour l'implémenter, javoue que la je suis un peu perdu.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Euh, un bout de code, non.

    Il s'agit de programmer un objet singleton dont on peut appeler une méthode void deleteWhenReleased(File), ce qui pousse cet objet à ajouter le fichier dans sa liste de fichier à supprimer. Cet objet a aussi son propre thread, qui passe son temps à attendre qu'un Timer, toutes les minutes, se déclenche, et à ce moment-là il essaie de supprimer tous les fichiers qu'il doit supprimer, et "oublie" ceux qu'il est enfin parvenu à supprimer.
    C'est assez simple, il faut juste faire attention à bien synchroniser le thread du timer avec les threads appelant deleteWhenReleased().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/03/2013, 12h07
  2. [Info] Conseils pour gérer les ressources
    Par calogerogigante dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 05/07/2009, 12h49
  3. [Continuum] [Maven2] probleme pour recuperer les ressources
    Par willoi dans le forum Intégration Continue
    Réponses: 4
    Dernier message: 24/04/2009, 10h56
  4. [Stratégie] taille de tableau max pour alleger les ressources systemes
    Par ceres02 dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 24/02/2006, 19h06

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