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?)?
Merde j'ai manqué cela, fermant le FileWriter !! incroyable. Merci. – portoalet
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
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. –