reghao пре 5 месеци
родитељ
комит
595b82607e

+ 25 - 13
jdk/src/main/java/cn/reghao/jutil/jdk/converter/ByteConverter.java

@@ -1,7 +1,9 @@
 package cn.reghao.jutil.jdk.converter;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.util.*;
 
 /**
  * 字节单位转换器
@@ -11,10 +13,12 @@ import java.util.Map;
  */
 public class ByteConverter {
     private final Map<Integer, String> map = new HashMap<>();
+    private final Map<Long, ByteType> map1 = new HashMap<>();
 
     public ByteConverter() {
         for (ByteType byteType : ByteType.values()) {
             map.put(byteType.ordinal(), byteType.name());
+            map1.put(byteType.getValue(), byteType);
         }
     }
 
@@ -37,18 +41,26 @@ public class ByteConverter {
         }
     }
 
-    public long convert(ByteType src, ByteType dest, long value) {
-        for (int i = src.ordinal(); i < dest.ordinal(); i++) {
-            value = value >> 10;
+    /**
+     * @param value 单位为 byte, 且值不大于 ByteType.PiB
+     * @return 精度为两位小数
+     * @date 2025-09-26 14:42:55
+     */
+    public String convert(long value) {
+        List<Long> list = new ArrayList<>(map1.keySet());
+        Collections.sort(list);
+        int i = list.size()-1;
+        for (; i > 0; i--) {
+            if (value > list.get(i)) {
+                break;
+            }
         }
+        ByteType byteType = map1.get(list.get(i));
 
-        return value;
-    }
-
-    public String convertStr(ByteType src, ByteType dest, long value) {
-        for (int i = src.ordinal(); i < dest.ordinal(); i++) {
-            value = value >> 10;
-        }
-        return value + dest.name();
+        int scale = 2;
+        BigDecimal b1 = new BigDecimal(value);
+        BigDecimal b2 = new BigDecimal(byteType.getValue());
+        BigDecimal result = b1.divide(b2, scale, RoundingMode.HALF_UP);
+        return String.format("%s%s", result, byteType.name());
     }
 }

+ 16 - 1
jdk/src/main/java/cn/reghao/jutil/jdk/converter/ByteType.java

@@ -5,5 +5,20 @@ package cn.reghao.jutil.jdk.converter;
  * @date 2019-10-29 16:23:15
  */
 public enum ByteType {
-    Bytes, KiB, MiB, GiB, TiB
+    Bytes(1L),
+    KiB(1024L),
+    MiB(1024L*1024),
+    GiB(1024L*1024*1024),
+    TiB(1024L*1024*1024*1024),
+    PiB(1024L*1024*1024*1024*1024);
+
+    private final long value;
+
+    ByteType(long value) {
+        this.value = value;
+    }
+
+    public long getValue() {
+        return value;
+    }
 }

+ 4 - 5
jdk/src/main/java/cn/reghao/jutil/jdk/jvm/model/MemoryStat.java

@@ -1,7 +1,6 @@
 package cn.reghao.jutil.jdk.jvm.model;
 
 import cn.reghao.jutil.jdk.converter.ByteConverter;
-import cn.reghao.jutil.jdk.converter.ByteType;
 
 import java.lang.management.MemoryUsage;
 
@@ -17,9 +16,9 @@ public class MemoryStat {
 
     public MemoryStat(MemoryUsage memoryUsage) {
         ByteConverter convert = new ByteConverter();
-        this.init = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getInit());
-        this.max = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getMax());
-        this.used = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getUsed());
-        this.committed = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getCommitted());
+        this.init = convert.convert(memoryUsage.getInit());
+        this.max = convert.convert(memoryUsage.getMax());
+        this.used = convert.convert(memoryUsage.getUsed());
+        this.committed = convert.convert(memoryUsage.getCommitted());
     }
 }

+ 17 - 0
jdk/src/test/java/JdkTest.java

@@ -0,0 +1,17 @@
+import cn.reghao.jutil.jdk.converter.ByteConverter;
+import cn.reghao.jutil.jdk.converter.ByteType;
+
+/**
+ * @author reghao
+ * @date 2025-09-26 14:06:56
+ */
+public class JdkTest {
+    public static void main(String[] args) {
+        ByteConverter byteConverter = new ByteConverter();
+
+        long total = 510873600L;
+        total = 235152568320L;
+        String totalStr = byteConverter.convert(total);
+        System.out.println(totalStr);
+    }
+}