gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:43:48 25 4
gpt4 key购买 nike

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

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

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

谢谢, jack

最佳答案

不关闭读取器可能会导致资源泄漏。删除打开的文件可能仍然没有问题。

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

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

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

关于java - BufferedReader 从未关闭,但文件能够删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15672492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com