我还是Java新手,我正在创建一个小程序,它必须检查一个文件夹,里面填充了以YYYYMMDD
格式创建日期后命名的数千个文件(例如{{1}如果它发现它们超过一周,则将它们移动到一个新目录中。目前,我的代码可以扫描文件夹并给我一个文件名列表,如果它发现有多个文件,则会创建他们需要移入的文件夹,但我怎么会真正去做检查文件名并在超过7天时移动它们?
这是我到目前为止所拥有的:
20130228
答案 0 :(得分:1)
class OldFileFilter extends FileFilter {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
public boolean accept(File f) {
Date date = dateFormat.parse(f.getName());
return System.currentTimeMillis() - date.getTime() > 7 * 24 * 3600 * 1000;
}
public String getDescription() {
return "Filter old files";
}
}
File[] files = dir.listFiles(new OldFileFilter());
//Then move...
对于Java 7中的nio,请检查How to replace File.listFiles(FileFilter filter) with nio in Java 7
答案 1 :(得分:0)
可能有两种解决方案
1-要获取文件的最后修改日期,我们可以使用File类的lastModified()方法。此方法返回一个long值。获取此值后,您可以创建java.util.Date类的实例并将此值作为参数传递。此日期将保留文件的最后修改日期。
您可以获取所有文件,并将lastModified日期的每个文件与您请求的日期进行比较。
2-
public static void deleteFilesOlderThanNdays(int daysBack, String dirWay, org.apache.commons.logging.Log log) {
File directory = new File(dirWay);
if(directory.exists()){
File[] listFiles = directory.listFiles();
long purgeTime = System.currentTimeMillis() - (daysBack * 24 * 60 * 60 * 1000);
for(File listFile : listFiles) {
if(listFile.lastModified() < purgeTime) {
if(!listFile.delete()) {
System.err.println("Unable to delete file: " + listFile);
}
}
}
} else {
log.warn("Files were not deleted, directory " + dirWay + " does'nt exist!");
}
}
此处而不是删除您应将这些文件移动到所需的文件夹。
答案 2 :(得分:0)
解析文件名,检查now和date之间的差异&gt; 7天
Date date = dateFormat.parse(file.getName());
if (System.currentTimeMillis() - date.getTime() > 7 * 24 * 3600 * 1000) {
// older than 7 days
}
答案 3 :(得分:0)
您可以通过将文件名与当前日期进行比较来完成此操作:
SimpleDateFormat formatter;
formatter = new SimpleDateFormat("yyyyMMdd");
Date d = null;
try {
d = formatter.parse(filename);//filename of the file
} catch (ParseException e) {
e.printStackTrace();
}
Date newDate = new Date();
if (newDate.getTime() - d.getTime() > 7 * 24 * 3600 * 1000) {
//Whatever You want to do
}
答案 4 :(得分:0)
一些想法......
谨防省略跟踪时间。我知道你在思考整天。但请记住,一天的开始和结束取决于时区。如果未指定时区,则使用JVM的默认值。这意味着,如果您在其他计算机/服务器上部署了应用程序,或者计算机/ JVM的时区已更改,则会出现不同的行为。
如果您的格式中包含连字符,则您将遵循常见的ISO 8601格式:YYYY-MM-DD
。这种格式更容易阅读。 Joda-Time也很方便地使用这种格式(如下所述)。
据我所知,当你在文件夹/目录中存储超过两三千个文件时,大多数文件系统都会变得暴躁。验证本机操作系统文件系统的行为,或者将文件分组到嵌套文件夹中,例如按月或按年分组。
使用Joda-Time库可以更轻松地完成此类日期工作。 java.util.Date
&amp;与Java捆绑在一起的Calendar
类非常麻烦,应该避免使用。
在Joda-Time中,如果您确实想要忽略时区和时区,请使用LocalDate
类。否则,请使用DateTime
类加上DateTimeZone
对象。
LocalDate now = LocalDate.now();
LocalDate weekAgo = now.minusWeeks( 1 );
String input = "20130228";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyyMMdd" );
LocalDate fileLocalDate = formatter.parseLocalDate( input );
boolean isThisFileOld = fileLocalDate.isBefore( weekAgo );