检查文件是否存在没有太多垃圾

时间:2012-01-19 19:08:48

标签: java performance garbage-collection

我正在尝试执行以下操作:我有一个数据库,其中包含位于目录下的文件名。此目录不断变化(正在添加和删除下载的文件)。我的应用程序应首次扫描此目录并将文件添加到数据库中。应用程序第二次运行时,需要检查数据库中的文件名是否仍在目录中可用。

对于检查,我使用以下伪代码:

get the filename from the database
check if exists (file f = new File(filename))
                 if (f.exists()){
                     mark as existing;
                  } else {
                    mark is as deleted
                  }

if it does, then mark it as existing, else mark it as removed (later will clean the database up)

问题是:我如何检查数据库中的所有文件(如果存在而不会产生太多垃圾)?文件可以超过1000.使用“new File(...)”运行循环超过1000次将导致太多垃圾。

感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

  

文件可以超过1000个。使用“new File(...)”运行循环   超过1000次会造成太多垃圾。

真的?你测试过这个吗?我不认为这是现代系统中的一个重要问题。 (你最担心的是什么?JVM垃圾收集?)

否则,获取当前目录,然后调用.list().listFiles(),加载到Set以获得性能(HashSet可能会很好地执行),然后只需查询反对集。 (你仍然会在Set中创建可能与GC类似的字符串和条目。)这里潜在的问题是你现在正在将一个潜在的“大量”元素加载到JVM中的内存中 - 而不是检查当您从数据库中读取每一行时按需按需。

我坚持使用您概述的代码。为Michal的答案+1 - 请查看更多详细信息,了解为什么这样做无关紧要。

答案 1 :(得分:4)

File()对象非常小。它中只有路径字符串,并且引用了FileSystem对象。它看起来像浪费资源,但事实并非如此。

File对象视为路径字符串,其中包含很少的辅助方法来处理文件路径。 它与文件描述符或其他重型资源无关。

在分析之前不要进行优化。最终会得到非最佳的难以维护的代码。

答案 2 :(得分:0)

以另一种方式执行 - 将一组行添加到数据库表中。然后扫描文件所在的目录,只获取文件名列表,并将该列表与“从filesTable中选择名称”类型的查询进行比较。

相关问题