Newsgroup: it.comp.java
Titolo: java.io.IOException: Too many open files && rilascio risorse allocate da BufferedImage (aiutooo!)

Salve,
Il mio programma solleva questa eccezione:
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: 
javax.imageio.IIOException: Can't create cache file!
     at org.ordanomade.interfaccia.ImageKit.read(ImageKit.java:30)
.........
Caused by:
     at javax.imageio.ImageIO.createImageInputStream(ImageIO.java:335)
     at javax.imageio.ImageIO.read(ImageIO.java:1325)
and next:
Caused by: java.io.IOException: Too many open files
     at java.io.UnixFileSystem.createFileExclusively(Native Method)
Il pezzo di codice a cui si riferisce viene chiamato da qui:
...
byte[] bytes = ImageKit.getBytes(chunkImage, quality/100f);
BufferedImage chunkImage = ImageKit.read(bytes);
g2d.drawImage(chunkImage, x, y, Color.WHITE, null);
chunkImage.flush();
....
E questo è invece il pezzo di codice interessato (ImageKit.java:30):
public static BufferedImage read(byte[] bytes) {
         try {
             File cache = new File("/var/tmp/");
             ImageIO.setCacheDirectory(cache);
             return ImageIO.read(new ByteArrayInputStream(bytes));
         } catch(IOException e) {
             throw new RuntimeException(e);
         }
     }
Sto comprimendo (JPEG) parti di immagini, e tali parti sono a volte
molte...di qui il problema.
La domanda è come posso rilasciare/chiudere questa BufferedImage???
Non sò precisamente il numero di volte che questi "chunk" vengono aperti
ma credo, a ragione, che non si superi le 1000volte.
Grazie veramente molte a chiunque voglia/possa aiutarmi!
Sono quasi disperato eheheh
Un saluto e buonagiornata!
Gabriele


Come è buona educazione chiudere le porte e anche buona educazione 
chiudere i file.
Devi chiudere tutti i file che apri.
Non conosco le classi che stai usando ma credo ad occhio credo che una 
di queste abbia un metodo .close() e dovresti chiamarlo quando hai 
finito di usare la risorsa.
Senza saperne niente direi che dovresti aggiungere un chunkImage.close():
byte[] bytes = ImageKit.getBytes(chunkImage, quality/100f);
BufferedImage chunkImage = ImageKit.read(bytes);
g2d.drawImage(chunkImage, x, y, Color.WHITE, null);
chunkImage.flush();
chunkImage.close();
Potrei sbagliarmi, non conosco queste classi.
Fammi sapere se va, che sono curioso, ciao.
-- 
Andrea Francia
http://www.andreafrancia.it/

 Senza saperne niente direi che dovresti aggiungere un chunkImage.close():
Per BufferedImage tale metodo non esiste!
Il massimo che ho trovato è stato flush()
L'immagine originale viene aperta una, e una sola, volta a inzio codice...
questo piccolo stralcio che ti ho riportato viene eseguito molte volte 
all'interno
di un loop, ed è per questo che il numero di "aperture" è alto, ma non 
credevo
così alto da cozzare con il numero massimo di file apribili in linux (su 
ext3).
Se ti dovesse venire in mente qualche altra cosa te ne sarei 
immensamente grato!
Grazie!
Gabriele

 immensamente grato!
Non so cosa dirti, sembra che il problema sia di ImageIO che non riesce 
a creare i file di cache.
Non c'e' un metodo ImageIO.setMaxNumberOfCacheFilesToUse() ?
E poi perché usi /var/tmp e non /tmp ? Esiste la directory /var/tmp? è 
scrivibile. Potrebbe succedere che il software sbagli a riportarti 
l'errore.
Il tuo sistema è carico?
Cerca di capire quando è generata l'eccezione java.io.IOException: Too 
many open files. Accade quando ci sono troppi file aperti da un processo 
o quando ci sono troppi file aperti nel sistema? Nel primo caso devi 
ritoccare il tuo programma, nel secondo vuol dire che il tuo sistema è 
carico.
Prova il programma in windows, funziona?
Stai usando gcj e gnu classpath o stai usando java della Sun? Prova con 
Java della sun.
Prova a vedere se ti da lo stesso problema anche quando apri una sola 
immagine.
Buon bug hunting.


Ho, più o meno, risolto non facendogli utilizzare cache:
ImageIO.setUseCache(false);
In questo modo non crea file temporanei e sembra funzionare...
Sicuramente fino a 193500 non solleva eccezioni e fa il suo dovere :)))
Ciao e grazie!
Gabriele