Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Impossible de supprimer/déplacer des fichiers images

8 réponses
Avatar
Rémi KLAJN
Bonjour à vous.

Voila mon problème:

Une application graphique en swing affiche la liste des images contenues
dans un dossier, en cliquant sur l'image celle-ci s'affiche dans un
composant, et si l'utilisateur veut supprimer l'image, il clique sur un
bouton dédié et l'image est sensée être supprimée.

Le problème, c'est que les méthodes delete() et renameTo( "blabla" ) de
la File pointant sur l'image en question me renvoient toutes les 2 false
(alors que la méthode canWrite() me renvoie elle true).

Le plus déroutant dans tout ça c'est que quelquefois, la suppression
(ou déplacement) fonctionne.

J'ai les droits de modification et compagnie sur les fichier/dossiers et
je ne vois pas ce qui cause ce problème.

Peut être l'objet de classe ParameterBlock que j'utilise pour créer mon
image JAI verrouille ces fichiers ?

Peut être est ce du à la création de l'image JAI via la méthode
JAI.create("filesystem", parameterblock) qui bloquerai le fichier ?

Merci, de votre future aide,
A+

8 réponses

Avatar
TestMan
Bonjour à vous.

Voila mon problème:

Une application graphique en swing affiche la liste des images contenues
dans un dossier, en cliquant sur l'image celle-ci s'affiche dans un
composant, et si l'utilisateur veut supprimer l'image, il clique sur un
bouton dédié et l'image est sensée être supprimée.

Le problème, c'est que les méthodes delete() et renameTo( "blabla" ) de
la File pointant sur l'image en question me renvoient toutes les 2 false
(alors que la méthode canWrite() me renvoie elle true).

Le plus déroutant dans tout ça c'est que quelquefois, la suppression
(ou déplacement) fonctionne.

J'ai les droits de modification et compagnie sur les fichier/dossiers et
je ne vois pas ce qui cause ce problème.

Peut être l'objet de classe ParameterBlock que j'utilise pour créer mon
image JAI verrouille ces fichiers ?

Peut être est ce du à la création de l'image JAI via la méthode
JAI.create("filesystem", parameterblock) qui bloquerai le fichier ?

Merci, de votre future aide,
A+


Bonjour,

Avez-vous testé avec ImageIO à la place du JAI ?

A+
TM

Avatar
Rémi KLAJN
J'ai (enfin) résolu mon problème.
Alors pour ceux qui le rencontreraients, voici la solution:

* Je créais mes objets JAI, les affichais.
* Lorsque l'utilisateur voulait supprimer un fichier, je mettais
les objets JAI à null, j'enlevais l'affichage etc...
* Le problème venait du fait que le garbage collector semblait ne
pas effacer assez tôt les objets JAI de la mémoire (quel flemmard !). Un
appel à la méthode : System.gc(); m'a permis de tout résoudre. Celle-ci
permet au développeur d'appeler manuellement le garbage collector.

Un problème auquel il fallait penser, mais après tous les tests que j'ai
fait, il ne restait plus 36 possibilités.

Merci pour vos tentatives d'aide,
A+
Avatar
JLP
"Rémi KLAJN" a écrit dans le message de
news:ee8fdu$20rf$
J'ai (enfin) résolu mon problème.
Alors pour ceux qui le rencontreraients, voici la solution:

* Je créais mes objets JAI, les affichais.
* Lorsque l'utilisateur voulait supprimer un fichier, je mettais
les objets JAI à null, j'enlevais l'affichage etc...
* Le problème venait du fait que le garbage collector semblait ne
pas effacer assez tôt les objets JAI de la mémoire (quel flemmard !). Un
appel à la méthode : System.gc(); m'a permis de tout résoudre. Celle-ci
permet au développeur d'appeler manuellement le garbage collector.

Un problème auquel il fallait penser, mais après tous les tests que j'ai
fait, il ne restait plus 36 possibilités.

Merci pour vos tentatives d'aide,
A+
Fausse bonne solution, car certaines VM, inhibe cette commande (

System.gc()). Laisser faire le gc, il les supprimera quand il aura besoin de
l'espace.

Avatar
alexandre cartapanis
"Rémi KLAJN" a écrit dans le message de
news:ee8fdu$20rf$
J'ai (enfin) résolu mon problème.
Alors pour ceux qui le rencontreraients, voici la solution:

* Je créais mes objets JAI, les affichais.
* Lorsque l'utilisateur voulait supprimer un fichier, je mettais
les objets JAI à null, j'enlevais l'affichage etc...
* Le problème venait du fait que le garbage collector semblait ne
pas effacer assez tôt les objets JAI de la mémoire (quel flemmard !). Un
appel à la méthode : System.gc(); m'a permis de tout résoudre. C elle-ci
permet au développeur d'appeler manuellement le garbage collector.

Un problème auquel il fallait penser, mais après tous les tests qu e j'ai
fait, il ne restait plus 36 possibilités.

Merci pour vos tentatives d'aide,
A+
Fausse bonne solution, car certaines VM, inhibe cette commande (

System.gc()). Laisser faire le gc, il les supprimera quand il aura beso in de
l'espace.




Un autre solution possible est d'utiliser les soft reference
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ref/package-summary.ht ml).
L'idée est de pouvoir libérer une ressource des qu'il n'y a plus de
référence direct.

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email


Avatar
Rémi KLAJN
alexandre cartapanis wrote:


"Rémi KLAJN" a écrit dans le message de
news:ee8fdu$20rf$

J'ai (enfin) résolu mon problème.
Alors pour ceux qui le rencontreraients, voici la solution:

* Je créais mes objets JAI, les affichais.
* Lorsque l'utilisateur voulait supprimer un fichier, je mettais
les objets JAI à null, j'enlevais l'affichage etc...
* Le problème venait du fait que le garbage collector semblait ne
pas effacer assez tôt les objets JAI de la mémoire (quel flemmard !). Un
appel à la méthode : System.gc(); m'a permis de tout résoudre. Celle-ci
permet au développeur d'appeler manuellement le garbage collector.

Un problème auquel il fallait penser, mais après tous les tests que j'ai
fait, il ne restait plus 36 possibilités.

Merci pour vos tentatives d'aide,
A+


Fausse bonne solution, car certaines VM, inhibe cette commande (
System.gc()). Laisser faire le gc, il les supprimera quand il aura besoin de
l'espace.





Un autre solution possible est d'utiliser les soft reference
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ref/package-summary.html).
L'idée est de pouvoir libérer une ressource des qu'il n'y a plus de
référence direct.

Laisser faire le gc... j'ai déja essayé et c'était la cause de mon

problème: impossible de supprimer les fichiers.

La solution des références m'intéresse mais je croyais que c'était le
role du garbage collector de libérer la ressource dès qu'il n'y avait
plus de référence directe.



Avatar
alexandre cartapanis
alexandre cartapanis wrote:


"Rémi KLAJN" a écrit dans le message de
news:ee8fdu$20rf$

J'ai (enfin) résolu mon problème.
Alors pour ceux qui le rencontreraients, voici la solution:

* Je créais mes objets JAI, les affichais.
* Lorsque l'utilisateur voulait supprimer un fichier, je mettais
les objets JAI à null, j'enlevais l'affichage etc...
* Le problème venait du fait que le garbage collector semblait ne
pas effacer assez tôt les objets JAI de la mémoire (quel flemmar d
!). Un
appel à la méthode : System.gc(); m'a permis de tout résoudre. Celle-ci
permet au développeur d'appeler manuellement le garbage collector.

Un problème auquel il fallait penser, mais après tous les tests que
j'ai
fait, il ne restait plus 36 possibilités.

Merci pour vos tentatives d'aide,
A+


Fausse bonne solution, car certaines VM, inhibe cette commande (
System.gc()). Laisser faire le gc, il les supprimera quand il aura
besoin de
l'espace.





Un autre solution possible est d'utiliser les soft reference
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ref/package-summary .html).

L'idée est de pouvoir libérer une ressource des qu'il n'y a plus d e
référence direct.

Laisser faire le gc... j'ai déja essayé et c'était la cause de mo n

problème: impossible de supprimer les fichiers.

La solution des références m'intéresse mais je croyais que c'ét ait le
role du garbage collector de libérer la ressource dès qu'il n'y ava it
plus de référence directe.


En théorie oui. Sauf qu'il ne tourne pas en permanence, il fais ses
petites affaires "de temps en temps".

Donc soit tu peux le forcer a travailler en faisant System.gc();, soit
tu peux essayer avec les références. Je suis loin d'être un expert a ce
sujet, mais ça permet de libérer des ressources "automatiquement" en
quelque sorte. On peux voir ça comme un marqueur qui dit "libère moi des
que possible" au garbage collector. Enfin ça dépend des référence s (et
oui, il y'en a plusieurs type en plus).

Une petite recherche google "java +'weak reference'" ou"java +'soft
reference'" devrait te donner pas mal de réponses. Je rajoute juste une
petite page en français qui est assez bien écrite:
http://www.progx.org/index.php?section=replies&newsidf4:

Bonne chance :)

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email




Avatar
Rémi KLAJN
alexandre cartapanis wrote:

alexandre cartapanis wrote:




"Rémi KLAJN" a écrit dans le message de
news:ee8fdu$20rf$


J'ai (enfin) résolu mon problème.
Alors pour ceux qui le rencontreraients, voici la solution:

* Je créais mes objets JAI, les affichais.
* Lorsque l'utilisateur voulait supprimer un fichier, je mettais
les objets JAI à null, j'enlevais l'affichage etc...
* Le problème venait du fait que le garbage collector semblait ne
pas effacer assez tôt les objets JAI de la mémoire (quel flemmard
!). Un
appel à la méthode : System.gc(); m'a permis de tout résoudre. Celle-ci
permet au développeur d'appeler manuellement le garbage collector.

Un problème auquel il fallait penser, mais après tous les tests que
j'ai
fait, il ne restait plus 36 possibilités.

Merci pour vos tentatives d'aide,
A+


Fausse bonne solution, car certaines VM, inhibe cette commande (
System.gc()). Laisser faire le gc, il les supprimera quand il aura
besoin de
l'espace.





Un autre solution possible est d'utiliser les soft reference
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ref/package-summary.html).

L'idée est de pouvoir libérer une ressource des qu'il n'y a plus de
référence direct.



Laisser faire le gc... j'ai déja essayé et c'était la cause de mon
problème: impossible de supprimer les fichiers.

La solution des références m'intéresse mais je croyais que c'était le
role du garbage collector de libérer la ressource dès qu'il n'y avait
plus de référence directe.



En théorie oui. Sauf qu'il ne tourne pas en permanence, il fais ses
petites affaires "de temps en temps".

Donc soit tu peux le forcer a travailler en faisant System.gc();, soit
tu peux essayer avec les références. Je suis loin d'être un expert a ce
sujet, mais ça permet de libérer des ressources "automatiquement" en
quelque sorte. On peux voir ça comme un marqueur qui dit "libère moi des
que possible" au garbage collector. Enfin ça dépend des références (et
oui, il y'en a plusieurs type en plus).

Une petite recherche google "java +'weak reference'" ou"java +'soft
reference'" devrait te donner pas mal de réponses. Je rajoute juste une
petite page en français qui est assez bien écrite:
http://www.progx.org/index.php?section=replies&newsidf4:

Bonne chance :)

J'ai essayé les SoftException, le problème reste présent (peut être

moins fréquent).
Un appel à System.gc() est toujours nécessaire pour libérer les ressources.
Merci de votre aide,
à bientot





Avatar
Alain
alexandre cartapanis wrote:

Laisser faire le gc... j'ai déja essayé et c'était la cause de mon
problème: impossible de supprimer les fichiers.

La solution des références m'intéresse mais je croyais que c'était le
role du garbage collector de libérer la ressource *dès* qu'il n'y avait
plus de référence directe.
en fait c'est là l'erreur.

le rôle du GC est de n'effacer que les objets inutilisés, en épargnant
les autres...

rien ne l'oblige a tout effacer, et moins encore à le faire vite.

de l'avis des connaisseurs, les méthodes finalize() sont sources de
catastrophes... ca peut ressuciter certains objets, et autres horreurs.

si quelque chose doit être fait pour libérer une ressource (un fichier,
une connexion), il faut explicitement faire un truc comme close(), qui
libère la ressource...
pour exemple voir les drames liés au applications JDBC qui oublient les
ResultSet.close(), Statement.close() ou connexion.close(), ou les appli
qui oublie les Stream.close()...

le GC n'est là que pour l'économie mémoire, pas pour le reste.
en théorie si on avait une mémoire infinie, une JVM pourrais ne rien
garbager.

si ca marche, ce sera par chance.

quand aux weakreference, ca ne change rien. c'est a utiliser quand vous
voulez garder un objet au chaud tant qu'il reste de la mémoire, mais
êtres prêt à le voir disparaître quand la mémoire deviens serrée.

aucune garantie qu'il disparaisse néanmoins.