是否有用于';是否相当于java.util.concurrent.TimeUnit?

是否有用于';是否相当于java.util.concurrent.TimeUnit?,java,time,enums,filesize,Java,Time,Enums,Filesize,我一直喜欢使用时间单位的作业的可读性,比如: long timePeriodInMillis = TimeUnit.MINUTES.toMillis( 53 ); 例如: long timePeriodInMillis = 53 * 60 * 1000; 是否有等效的枚举可用于文件大小单位?差不多 long maxBits = FilesizeUnit.MEGABYTES.toBits( 11 ); 不需要,但您可以通过以下方式轻松转换: long maxBits = 11L * 1024

我一直喜欢使用时间单位的作业的可读性,比如:

long timePeriodInMillis = TimeUnit.MINUTES.toMillis( 53 );
例如:

long timePeriodInMillis = 53 * 60 * 1000;
是否有等效的枚举可用于文件大小单位?差不多

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

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

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


根据您对.

的定义,查看Java文档中的
可比
接口(该接口由
时间单位
实现),没有这样的东西。请看这里:


然而,有了这个链接,您就不难获得自己的工作版本,以便在项目中使用。

半年前,我做了类似的事情,只是为了从时间单位枚举中获得乐趣

明天我将在GitHub上传它。它包含两个枚举:
BitUnit
ByteUnit
。两者还支持彼此之间的转换。ByteUnit支持基于2的前缀以及基于10的前缀。(Enum常量和方法在
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位以外的字大小。 希望你能等到明天


编辑

给你:


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

apachecommons在
FileUtils
类中提供常量,如

  • FileUtils.ONE\u MB
  • FileUtils.ONE\u GB
资料来源:


他们对KB的定义是基于1024字节(MB是KB²,如此之长)。

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

使用示例:

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

如果超过1G字节,这将执行整数运算和溢出。我建议至少让这些常量中的一个具有尾随
L
或强制转换。当然,但显式乘法是我试图避免的。好的一点,上面已经修复。与这些常量无关,但会超过255MB。现在显式类型可以避免以后的麻烦。我刚刚创建了一个帐户。请给我一秒钟时间来正确安装和配置eGit。这是我第一次使用Git——只是有过svn和cvs方面的经验。:)@法比安巴尼如果像这样的东西能进入番石榴图书馆,那就太棒了。您是否打算与他们或其他各方共享您的代码?您的枚举将完全适合Guava包含的其他类(我认为)。@Kohányi Róbert我决定将其置于Apache许可证2下,就像Guava和Apache Commons一样。因此,当他们决定将其包括在内时,确实没有问题。但要使该枚举成熟,还需要做一些工作。由于其当前的实现,它的准确性不如推压
double
类型边界的大量数据。但是,在这些领域更加精确会破坏代码,所以我决定坚持使用更好的可维护版本。@Kohányi Róbert我将其作为增强问题提供给guava-你可能会投票支持它:
可比性
如何与问题相关?@Alexei Osipov:如果有一个等效的枚举,它将实现可比较(如果它实际上与时间单位具有相同的结构)。我认为这是一种聪明的方法,可以通过API来搜索(不)存在这样一个枚举。令人难过的是,只有一个帖子试图回答这个问题,而不是提供一个替代方案。
Long bytesIn5Mb = DataSize.ofMegabytes(5).toBytes(); // 5MB to bytes
Long kbIn1Tb = DataSize.ofTerabytes(1).toKilobytes(); // 1TB to KB