BufferedReader从未关闭,但文件能够删除

时间:2013-03-28 01:06:55

标签: java file bufferedreader java-io

最近,我查看了我们的应用程序代码,并在代码中发现了一个问题。

/**
 * truncate cat tree(s) from the import file
 */
private void truncateCatTreesInFile(File file, String userImplCode) throws Exception
 {
     String rowStr = null, treeCode = null;
     BufferedReader reader = new BufferedReader(new FileReader(file));
     rowStr = reader.readLine(); // skip 1st row - header
     Impl impl;
     List<String> row = null;
     Set<String> truncatedTrees = new HashSet<String>();
     while ((rowStr = reader.readLine()) != null)
     {
         row = CrudServiceHelper.getRowFromFile(rowStr);
         if (row == null) continue;

         impl = getCatImportImpl(row.get(ECatTreeExportImportData.IMPL.getIndex()), userImplCode);
         treeCode = row.get(ECatTreeExportImportData.TREE_CODE.getIndex());
         if(truncatedTrees.contains(treeCode)) continue;

         truncatedTrees.add(treeCode);             
         CatTree catTree = _treeDao.findByCodeAndImpl(treeCode, impl.getId());
         if(catTree!= null) _treeDao.makeTransient(catTree);             
     }
     _treeDao.flush();   
 }

看看上面的代码,“读者”从未关闭,我认为这可能是一个问题,但实际上,它只是工作正常,文件可以通过tomcat删除。

 javax.servlet.context.tempdir>
 [java] 2013-03-27 17:45:54,285 INFO [org.apache.struts2.dispatcher.Dispatch

呃] -

基本上,我要做的是从浏览器上传一个文件,并根据文件生成sql以将数据插入到我们的数据库中。完成后,删除该文件。

我很惊讶这段代码工作得很好,有没有人有想法?我试着谷歌,但我没有任何想法。

谢谢, 杰克

1 个答案:

答案 0 :(得分:1)

不关闭阅读器可能会导致资源泄漏。删除打开的文件可能仍然完全正常。

在Linux(和其他Unix变体)下删除文件,如果只是取消链接名称。没有任何名字的文件实际上被释放。因此,打开文件,删除文件(删除其名称)然后读取和写入文件是获取临时文件的众所周知的方法。文件关闭后,空间将被释放,但不会更早。

在Windows下,某些程序会锁定它们读取的文件,这会阻止其他进程删除此类文件。但并非所有程序都这样做。我没有Windows机器来实际测试Java如何处理它。

代码不会崩溃这一事实并不意味着代码完全正常工作。如果应用程序由于泄漏而消耗了越来越多的RAM,那么您注意到的问题可能会在稍后显现。但这不太可能:垃圾收集器最终将关闭读者,可能很快,因为reader是本地的,并且永远不会从方法中泄漏。