【问题标题】:Is there a Java enum for filesize units that's equivalent to java.util.concurrent.TimeUnit?是否有与 java.util.concurrent.TimeUnit 等效的文件大小单元的 Java 枚举?
【发布时间】:2012-01-19 17:16:41
【问题描述】:

我一直很喜欢这样使用 TimeUnit 的作业的可读性:

long timePeriodInMillis = TimeUnit.MINUTES.toMillis( 53 );

类似的东西:

long timePeriodInMillis = 53 * 60 * 1000;

是否有可以用于文件大小单位的等效枚举?类似的东西

long maxBits = FilesizeUnit.MEGABYTES.toBits( 11 );

【问题讨论】:

    标签: java time enums filesize


    【解决方案1】:

    不,但您可以通过以下方式轻松转换自己:

    long maxBits = 11L * 1024 * 1024 * 8;
    

    long maxBits = 11L * 1000 * 1000 * 8;
    

    取决于您对megabyte 的定义。

    【讨论】:

    • 如果超过 1 GB,这将执行整数运算并溢出。我建议至少让其中一个常量有一个尾随 L 或演员表。
    • 当然,但是我要避免显式乘法。
    • 好点,固定在上面。这些常数无关紧要,但会超过 255 Mb。现在的显式类型可以避免以后的麻烦。
    【解决方案2】:

    查看TimeUnit 实现的Comparable 接口的Java 文档,没有这样的东西。见这里:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Comparable.html

    但是,通过该链接,您应该不难推导出自己的工作版本以在您的项目中使用。

    【讨论】:

    • Comparable 与该问题有何关联?
    • @Alexei Osipov:如果有一个等效的枚举,它将实现 Comparable(如果它实际上具有与 TimeUnit 相同的结构)。我认为这是一种在 API 中搜索(不)存在这种枚举的聪明方法。很遗憾看到对试图回答问题而不是提供替代方案的唯一帖子投了反对票。
    【解决方案3】:

    半年前我就做过类似的事情,只是为了好玩,受 TimeUnit 枚举的启发。

    我明天会把它上传到 GitHub。它包含两个枚举:BitUnitByteUnit。两者还支持相互转换。 ByteUnit 支持基于 2 的前缀以及基于 10 的前缀。 (ByteUnit 中的枚举常量和方法使用 IEC 80000-13 术语作为前缀。)

    用法如下:

    System.out.println(BitUnit.KBIT.toKiB(16000));
    
    System.out.println(ByteUnit.GIB.toMB(1));
    System.out.println(ByteUnit.GIB.toMiB(1));
    System.out.println(ByteUnit.GB.toMB(1));
    System.out.println(ByteUnit.GB.toMiB(1));
    

    ...并打印出来:

    1953.125
    
    1073.741824
    1024.0
    1000.0
    953.67431640625
    

    对于位和字节之间的转换方法,您已经重载了方法来指定每个字节 8 位以外的字长。 希望你能等到明天。


    编辑

    你在这里:https://github.com/fabian-barney/Utils

    不要因为目录结构而责备我——我对 Git 还不熟悉。 :)

    【讨论】:

    • 我刚刚创建了一个帐户。给我一点时间来正确安装和配置 eGit。这是我第一次使用 Git - 只是有 svn 和 cvs 的经验。 :)
    • @FabianBarney 如果这样的东西可以进入 Guava 库,那就太棒了。您是否打算与他们 或其他一些各方 共享您的代码?您的枚举将完全适合 Guava 包含的其他类(我认为)。
    • @Kohányi Róbert 我决定像 Guava 和 Apache Commons 一样将它放在 Apache License 2 下。因此,当他们决定包含它时,确实没有问题。但是要使这个枚举成熟,还有一些工作要做。由于其当前的实现,它不如对double 类型边界的大量推动准确。但是在这些领域让它更准确会炸毁代码,所以我决定坚持使用更好的可维护版本。
    • @Kohányi Róbert 我将它作为增强问题提供给番石榴 - 你可能想投票给它:code.google.com/p/guava-libraries/issues/detail?id=827
    【解决方案4】:

    Apache commons 在FileUtils 类中提供常量,比如

    • FileUtils.ONE_MB
    • FileUtils.ONE_GB
    • ...

    来源:https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/FileUtils.html

    他们对 KB 的定义是基于 1024 字节(1 MB 是 KB²,等等)。

    【讨论】:

      【解决方案5】:

      如果您使用的是 Spring,那么已经有一个用于数据单元转换的实用程序类:org.springframework.util.unit.DataSize。 此类以字节为单位对数据大小进行建模,并且是不可变的和线程安全的。

      使用示例:

      Long bytesIn5Mb = DataSize.ofMegabytes(5).toBytes(); // 5MB to bytes
      Long kbIn1Tb = DataSize.ofTerabytes(1).toKilobytes(); // 1TB to KB
      

      【讨论】:

        猜你喜欢
        • 2011-11-02
        • 2014-07-12
        • 2011-09-23
        • 2020-11-30
        • 2011-01-11
        • 2017-03-12
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        相关资源
        最近更新 更多