【问题标题】:How to calculate number of documents per hour depending on their "last modified"如何根据“最后修改”计算每小时的文档数量
【发布时间】:2017-04-05 12:53:47
【问题描述】:

我正在开发一种工具来计算来自另一个程序的存档文件。因此,我使用 DirectoryStream 和过滤子目录以及一些带有简单 if 子句的文件(如下所示)。

对于我想知道的统计数据,平均每小时创建多少个文档。

我在处理文件和目录方面不是很有经验,但我猜有某种“getLastModified”,从最老到最年轻的时间范围获取并计算每小时的平均文档数?

【问题讨论】:

  • 当您计算与 if 条件不匹配的文件时,您是否有理由不反转 if 条件?这样您就可以移动 if 块中的计数并删除 then 为空的 else 块。
  • 我只是把它写下来,就像我在想的那样......但是好点!谢谢

标签: java count average last-modified directorystream


【解决方案1】:

好吧,文件有一个lastModified() 方法,返回上次修改的时间戳。如果文件不存在或发生 I/O 错误,则返回 0。要将Path 转换为File,您可以使用toFile() 方法。这样,计算文件/小时的平均值将相当容易:

long minTimestamp = Long.MAX_VALUE; // definitely greater than any timestamp you will ever find
long maxTimestamp = 0;
int count = 0;

try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get("DIRECTORY PATH"))) {
    for(Path path: directoryStream) {
        if (!(Files.isDirectory(path) || path.toString().endsWith("\\databaseinfo.xml") || path.toString().endsWith(".log"))) {
            long lastModified = path.toFile().lastModified();
            if (lastModified > 0L) { // check that no error occurred
                if (lastModified < minTimestamp) minTimestamp = lastModified; // new minimum
                if (maxTimestamp < lastModified) maxTimestamp = lastModified; // new maximum
            }
            count = count + 1;
        }
    }

} catch (IOException e) {
    e.printStackTrace();
}
System.out.println(count);
double filesPerHour = 0;
if (maxTimestamp != minTimestamp) { // avoid division by 0
    filesPerHour = (double) count * 60 * 60 * 1000 / (maxTimestamp - minTimestamp); // 60 * 60 * 1000 = milliseconds in one hour
}
System.out.println(filesPerHour);

编辑:反转 if 条件,以避免在 else 块中有代码的空 if 语句

【讨论】:

  • 我想这个可以解决我的问题。最后一个 if 语句中缺少“filesPerHour = (double) ...”。
  • 输出现在是 -> 8.730948492447396,这不适合我的情况,正如我对 freedevs 的评论中提到的那样。我在同一天创建了大约 1483 个文档……第一个文档创建于 09:35,最后一个文档创建于 11:27。当前结果适合文件/分钟,因为在同一分钟创建了多个文件。
  • 您能否检查minTimestampmaxTimestampcount 是否正确或只是发布它们?此外,文件数为 1483,不包括 .log 文件和 databaseinfo.xml?
  • 我刚刚打印到控制台....System.out.println(minTimestamp/1000/60/60); System.out.println(maxTimestamp/1000/60/60); System.out.println(maxTimestamp/1000/60/60 - minTimestamp/1000/60/60);
  • 407335 407505 170
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多