【问题标题】:BufferedReader was never closed, but file was able to deleteBufferedReader 从未关闭,但文件能够删除
【发布时间】:2013-03-18 08:08:37
【问题描述】:

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

/**
 * 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 以将数据插入我们的数据库。完成后,删除文件。

我很惊讶这段代码运行良好,这里有人知道吗?我试图用谷歌搜索它,但我没有得到任何想法。

谢谢, 杰克

【问题讨论】:

    标签: java file bufferedreader java-io


    【解决方案1】:

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

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

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

    代码没有崩溃的事实并不意味着代码工作完全正确。如果应用程序由于泄漏而消耗越来越多的 RAM,那么您注意到的问题可能会在很久以后才会显现出来。不过,这不太可能:垃圾收集器最终会关闭读取器,而且可能很快就会关闭,因为reader 是本地的,永远不会泄漏到方法之外。

    【讨论】:

    • 我在本地 Windows 操作系统中对其进行了测试,这就是我感到惊讶的原因,因为我知道如果有任何程序在 Windows 中打开文件,并且任何其他程序试图删除该文件,它将是失败的。我想这可能是因为tomcat会在servlet释放后释放所有资源(我的意思是请求完成),并且tomcat也会自动删除临时文件。
    猜你喜欢
    • 2017-02-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多