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

Langage Java Discussion :

Libération de ressources à la fermeture du programme


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Par défaut Libération de ressources à la fermeture du programme
    Bonjour,

    J'ai un petit soucis dans mon appli.
    En gros, cette appli est un lecteur PDF en java. Le truc, c'est que les .pdf ne doivent pas être accessible autrement que par mon appli.
    J'ai donc crypté ces pdf.

    Quand j'exécute l'appli, les fichiers sont décryptés, placés dans un répertoire temporaire et lu. Jusque là, tout va bien.

    Seulement, je souhaiterais que le .pdf décryptés (celui mis dans le répertoire temporaire) soit supprimé à la fermeture de l'appli.
    Étant donné que le fichier est en lecture, je ne peux pas faire un simple file.delete();
    J'ai aussi essayé le try{}finally{} mais en faisant ça, la navigation sur le pdf (dans mon appli donc) devient impossible.
    Les ressources que j'utilise sont un FileChannel, un ByteBuffer et un RandomAccessFile. J'ai essayer de les close(); mais cette méthode n'existe pour aucun de ces objets.

    Donc comment puis-je faire pour liberer les ressources et supprimer mon fichier temporaire seulement à la fermeture du programme ?

    Merci d'avance

  2. #2
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Il existe peut être une autre solution, mais cela dépend de ton besoin.

    Est-ce que tu as besoin réellement d'avoir des fichier PDF décryptés?
    Peux-tu travailler directement sur des streams?

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Freeluvs Voir le message
    J'ai aussi essayé le try{}finally{} mais en faisant ça, la navigation sur le pdf (dans mon appli donc) devient impossible.
    C'est à dire ???

    Citation Envoyé par Freeluvs Voir le message
    Les ressources que j'utilise sont un FileChannel, un ByteBuffer et un RandomAccessFile. J'ai essayer de les close(); mais cette méthode n'existe pour aucun de ces objets.

    Tu parles de quels classes exactement ? Car les classes FileChannel et RandomAccessFile de l'API standard possèdent tous une méthode close()...

    Citation Envoyé par Freeluvs Voir le message
    Donc comment puis-je faire pour liberer les ressources et supprimer mon fichier temporaire seulement à la fermeture du programme ?
    Une solution serait d'utiliser deleteOnExit(), mais attention car elle est buggé et peut poser des soucis en cas d'utilisation abusive...

    Le mieux serait quand même de gérer proprement ses ressources et de supprimer un fichier dès qu'on ne l'utilise plus...


    a++

  4. #4
    Membre confirmé Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Par défaut
    Merci pour vos réponses.

    -adiGuba: j'avais bel et bien fait une erreur: lors de la déclaration de mes ressources j'avais pas mis "= null;" et du coup, Eclipse les considéraient comme non déclarées dans le finally.
    Et donc forcément, ne connaissant pas les objets, il me disait que les .close() n'existaient pas.

    Donc maintenant j'arrive bien à fermer le RandomAccessFile et le FileChannel, je n'ai plus d'erreur à l'éxecution, j'arrive à utiliser mon appli sans soucis, mais que ce soit avec un file.delete() ou file.deleteOnExit() mon fichier temporaire reste à sa place...

    -Deaf: je dois dans tout les cas passer par un fichier temporaire: les pdf, en plus d'être cryptés, ont leur extension de changer en ".nimportequoi". Je dois donc les renommer puis les decryptés pour pouvoir travailler dessus, et je peux rien y changer (cahier des charges oblige).

    Si vous avez d'autres idées pour la suite, je suis preneur
    Merci d'avance

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Freeluvs Voir le message
    Donc maintenant j'arrive bien à fermer le RandomAccessFile et le FileChannel, je n'ai plus d'erreur à l'éxecution, j'arrive à utiliser mon appli sans soucis, mais que ce soit avec un file.delete() ou file.deleteOnExit() mon fichier temporaire reste à sa place...
    Si le delete() ne fonctionne pas cela signifie surement que ton fichier est toujours ouvert...

    un exemple de code ne serait pas superflu...

    Citation Envoyé par Freeluvs Voir le message
    -Deaf: je dois dans tout les cas passer par un fichier temporaire: les pdf, en plus d'être cryptés, ont leur extension de changer en ".nimportequoi". Je dois donc les renommer puis les decryptés pour pouvoir travailler dessus, et je peux rien y changer (cahier des charges oblige).
    Cela dépend de ton traitement. Mais si tu dois uniquement lire le fichier dans ton application tu peux très bien passer par un flux (à condition que le décryptage puisse se faire à la volée).

    a++

  6. #6
    Membre confirmé Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Si le delete() ne fonctionne pas cela signifie surement que ton fichier est toujours ouvert...
    Ouai je viens de voir ça. Mais du coup, il n'y aurait pas moyen de faire se déclencher une action seulement quand l'application s'arrête ? (Je débute en Java, désolé pour mes questions un peu bête)

    Pour le bout 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
     
                    // Ici le file correspond à mon pdf renommé et décrypté, donc pret à l'emploi
                    File file = new File("monPdf.pdf");
    		FileChannel channel = null;
    		RandomAccessFile raf = null;
    		ByteBuffer buf = null;
    		try 
    		{
    			raf = new RandomAccessFile(file, "r");
    			channel = raf.getChannel();
    			buf = channel.map(FileChannel.MapMode.READ_ONLY,0, channel.size());
     
    			PDFFile pdffile = new PDFFile(buf);
    			page = pdffile.getPage(n);
    			nb_pages = pdffile.getNumPages();
    			panel.showPage(page);  
    		} 
    		finally 
    		{
    			raf.close();
    			channel.close();
    			file.delete();
    		}
    La classe PDFFile fait partie de la librairie (PDF Renderer) que j'utilise. Il y a bien une méthode prévue pour fermer un pdf ouvert (et donc liberer les ressources), mais comment faire pour que cette action se déclanche à la fermeture de l'appli ? Parce que dans le finally, ça se fait trop tôt.

    Edit: pour gerer une action a la fermeture de l'appli, étant donné que je passe par une JFrame, je pourrais pas jouer avec un WindowListener ?

    Citation Envoyé par adiGuba Voir le message
    Cela dépend de ton traitement. Mais si tu dois uniquement lire le fichier dans ton application tu peux très bien passer par un flux (à condition que le décryptage puisse se faire à la volée).
    Ouai mais étant donné qu'à la base j'ai un fichier monPdf.nimportequoi, je dois bien a un moment le renommer Et donc creer un fichier temporaire. Pour le décryptage je suis en train de regarder.

  7. #7
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Je ne connais pas ta librairie PDF, mais je ne pense pas qu'elle ait besoin de l'extension ".pdf".
    Il ne faut pas oublier que l'extension d'un fichier, ce n'est que pour faire joli

    Donc non, tu n'es pas obligé de renommer ton fichier. Il ne reste plus qu'à savoir si le décryptage peut se faire à la volée.

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

Discussions similaires

  1. libération des ressource d'une table
    Par dracula2000 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/06/2006, 19h06
  2. Réponses: 13
    Dernier message: 03/04/2006, 11h01
  3. Fermeture du programme
    Par oasis_5 dans le forum Général Python
    Réponses: 11
    Dernier message: 08/03/2006, 12h28
  4. [c++] Plantage à la fermeture du programme
    Par Asmodean dans le forum C++
    Réponses: 5
    Dernier message: 21/02/2006, 14h20
  5. Réponses: 7
    Dernier message: 24/01/2005, 12h36

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