如何减少在不断添加文件的目录中列出文件的时间
How to reduce time of listing files in a directory in which files are being added continously
我必须使用 FileFilter(基于日期修改)过滤目录中的文件。文件不断被添加到这个目录。
我正在使用线程池执行器来处理 FileFilter accept() 方法返回的每个文件。
但是列出此目录中的所有文件所花费的时间很长,这会减慢我的代码的完成时间。这是由于目录中不断添加文件。
有没有其他方法可以更快地列出文件。请注意,我需要在某个修改时间之前修改过的文件,并且正在通过 FileFilter 检查。
final ThreadPoolExecutor executor = poolFactory.getExecutor();
FileFilter fileFIlter = new FileFilter() {
@Override
public boolean accept(File file) {
if (file.getName().toUpperCase().contains(fileNameFilter) &&
null != startDate && file.lastModified() >= startDate.getTime() &&
null != endDate && file.lastModified() <= endDate.getTime()
) {
executor.execute(new FileFinder(file, textFinder));
return true;
}
return false;
}
};
file.listFiles(fileFIlter);
没有更快的读取目录的方法。这不是 Java 问题。简单的说,操作系统只有"indexes"一个目录的名字。任何其他形式的查找/查询都需要通过迭代所有条目(一次一个)并检索和测试文件属性来实现。
唯一比这更好的方法是首先扫描目录(在应用程序启动时),然后使用文件观察器服务查找任何更改。第一次扫描的时间与当前一样长,但使用文件观察器可避免重复扫描。
如果这对您不起作用,那么您将需要以不同的方式管理您的文件。例如:
也许您可以使用 File.rename
在处理完文件后将文件移动到另一个目录。
也许您可以将传入信息附加到现有文件的末尾,而不是创建新文件。
也许您可以将信息(直接)放入数据库,而无需中间文件。
如果您不能执行以上任一操作,那么很抱歉,没有办法让它运行得更快。
我必须使用 FileFilter(基于日期修改)过滤目录中的文件。文件不断被添加到这个目录。 我正在使用线程池执行器来处理 FileFilter accept() 方法返回的每个文件。
但是列出此目录中的所有文件所花费的时间很长,这会减慢我的代码的完成时间。这是由于目录中不断添加文件。
有没有其他方法可以更快地列出文件。请注意,我需要在某个修改时间之前修改过的文件,并且正在通过 FileFilter 检查。
final ThreadPoolExecutor executor = poolFactory.getExecutor();
FileFilter fileFIlter = new FileFilter() {
@Override
public boolean accept(File file) {
if (file.getName().toUpperCase().contains(fileNameFilter) &&
null != startDate && file.lastModified() >= startDate.getTime() &&
null != endDate && file.lastModified() <= endDate.getTime()
) {
executor.execute(new FileFinder(file, textFinder));
return true;
}
return false;
}
};
file.listFiles(fileFIlter);
没有更快的读取目录的方法。这不是 Java 问题。简单的说,操作系统只有"indexes"一个目录的名字。任何其他形式的查找/查询都需要通过迭代所有条目(一次一个)并检索和测试文件属性来实现。
唯一比这更好的方法是首先扫描目录(在应用程序启动时),然后使用文件观察器服务查找任何更改。第一次扫描的时间与当前一样长,但使用文件观察器可避免重复扫描。
如果这对您不起作用,那么您将需要以不同的方式管理您的文件。例如:
也许您可以使用
File.rename
在处理完文件后将文件移动到另一个目录。也许您可以将传入信息附加到现有文件的末尾,而不是创建新文件。
也许您可以将信息(直接)放入数据库,而无需中间文件。
如果您不能执行以上任一操作,那么很抱歉,没有办法让它运行得更快。