2010-11-08 5 views
2

J'utilise SpringFramework Web MVC et à l'intérieur du servlet handleRequestInternal, j'ai créé une variable pour accéder à un fichier dans le système de fichiers local, à savoirJava ressource version du fichier

protected ModelAndView handleRequestInternal(HttpServletRequest request,...... 
{ 
...... 
File file = new File(rssPath); 
if(!file.exists()) { 
    file.createNewFile(); 
    FileWriter outFile = new FileWriter(rssPath); 
    outFile.write(rssJson); 
    outFile.flush(); 
    //file = null; 
} 
} 

La question est, si je ne contiendraient pas le fichier à null, le fichier sera toujours utilisé et je ne peux pas écrire dessus.

Je dois attendre quelques secondes, probablement jusqu'à ce que GC vienne à collecter.

En regardant l'API de fichier, je ne vois aucune méthode comme close() pour libérer les ressources.

Alors, comment détruire la référence de fichier correctement (sans la mettre à zéro, ai-je oublié quelque chose?)?

Répondre

5

Vous ne pouvez pas fermer les fichiers. Mais vous devez fermer FileInputStream, FIleOutputStream, FileReader et FileWriter. Sinon, ces flux (et fichiers-poignées) ne seront pas GC. (jusqu'à ce que l'objet contenant le flux soit GCed)

EDIT: Faites ceci dans un finally -Block, pour être sûr que le close est appelé.

+0

Merde j'ai manqué cela, fermant le FileWriter !! incroyable. Merci. – portoalet

+0

Fermer un fichier dans un bloc finally n'est pas une bonne idée: cela signifie que votre fichier sera fermé même s'il y a une erreur (!) Pour faire un programme fiable, vous voulez vraiment le fermer s'il n'y a pas d'exception. Voir http://agiletribe.wordpress.com/2013/07/18/surprising-outrageous-file-handling/ Au lieu d'utiliser un bloc finally, il serait préférable d'utiliser un bloc catch et de supprimer le fichier qui pourrait être partiellement écrit . – AgilePro

+0

Les Streams peuvent être fermés dans un bloc finally. Mais vous avez raison dans ce cas, il doit y avoir une sorte de gestion des erreurs si une exception apparaît. Dans le catch-block, il pourrait toujours y avoir le code du fichier delete que vous avez mentionné dans le blog-post. Mais il y a toujours une erreur dans votre code, et le fichier ne peut pas être supprimé. si le close() dans le catch-block est une exception. –

4

Que diriez-vous de la méthode close() sur l'objet FileWriter?

outFile.close();

Questions connexes