2010-11-04 7 views
1

J'utilise le code suivant pour écrire des données dans des fichiers:java.io.FileNotFoundException (Trop de fichiers ouverts)

BufferedWriter writer = null; 
try { 
    writer = new BufferedWriter(new FileWriter(file)); 
    writer.write(...); 
    writer.flush(); 
} 
finally { 
    if (writer != null) 
     writer.close(); 
} 

Après avoir invoqué la méthode plusieurs fois je suis un FileNotFoundException parce que trop de fichiers sont ouverts.

De toute évidence, java ne ferme pas les handles de fichiers lorsque je ferme le flux d'écriture. Fermer le FileWriter séparément n'aide pas.

Y at-il sth. Je peux faire pour forcer Java à fermer les fichiers?

+0

Pouvez-vous publier votre pile de pile? Utilisez-vous cela peut-être dans un environnement multi-thread? – darioo

+0

Essayez d'ajouter 'try .. catch around'. –

Répondre

1

Non, Java ferme les poignées de fichier lorsque vous fermez le graveur. Il est en fait construit en utilisant Decorator pattern. Par conséquent, il doit être quelque chose d'autre. Afficher la trace de la pile

+0

La trace de la pile pointe uniquement sur le code que j'ai posté. Mais vous avez raison, les problèmes sont ailleurs. – Patrick

1

Voir this thread sur l'écriture aux fichiers, de bons conseils là .. faites attention au bloc enfin dans la réponse Anons. BufferedWriter ferme le flux sous-jacent.

0

Probablement, c'est un problème de multithreading. Vous pouvez conserver une instance de FileOutputStream et la fermer. Quelque chose comme:

 
java.io.FileOutputStream out = new java.io.FileOutputStream(file); 
try { 
    // make buffered writer, etc. 
} finally { 
    out.close(); 
} 

2

Votre code semble bien. Ce pourrait être une autre partie de votre application qui fuit des poignées de fichier.

Vous pouvez surveiller les descripteurs de fichiers en utilisant lsof sous Linux ou pfiles sous Solaris. Sous Windows, vous pouvez utiliser ProcessExplorer.

+1

Vous avez raison. Le problème ne se produit pas, si je cours seulement le code que j'ai posté. Bien qu'il ait lancé l'exception, il ne restait plus de fichiers à ouvrir. Il semble que je doive trouver la fuite ailleurs. – Patrick

Questions connexes