преобразовать размер байта в читаемый человеком формат в Java? - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь создать метод c stati String formatSize(long sizeInBytes) Этот метод должен возвращать наиболее подходящее представление для предоставленного размера файла (в байтах) в удобочитаемом формате с по крайней мере 2 десятичными знаками (кроме байтов). ).

вот мой код

public class HexEditor {

    public static void main(String[] args) {
        System.out.println(formatSize(2147483647));
        System.out.println(formatSize(123));
        System.out.println(formatSize(83647));
        System.out.println(formatSize(9585631));
        System.out.println(formatSize(188900977659375L));
    }
    public static String floatForm (double d){
       return new DecimalFormat("#.##").format(d);
    }

    public static String formatSize(long size) {


        double B = 1 * 8;
        double kibit = 1024;
        double KiB = B * kibit;
        double MiB = KiB * kibit;
        double GiB = MiB * kibit;
        double TiB = GiB * kibit;
        double Pib = TiB * kibit;

        if (size < kibit) {
            return size + " byte";

        } else if (size < KiB) {
            double result = size / kibit;
            return floatForm (result) + " Kibit";

        } else if (size < MiB) {
            double result = size / KiB;
            return floatForm (result) + " KiB";

        } else if (size < GiB) {
            double result = size / MiB;
            return floatForm (result) + " MiB";

        } else if (size < TiB) {
            double result = size / GiB;
            return floatForm (result) + " GiB";

        } else if (size < Pib) {
            double result = size / TiB;
            return floatForm (result) + " TiB";
        }

        return "";
    }

}

это мои входы и ожидаемые выходы

вход-выход

2147483647          2.00 GiB
123                 123 bytes
83647               81.69 KiB
9585631             9.14 MiB
188900977659375     171.80 TiB

но когда мой код запускается, он выдает разные выходные данные

    256 MiB
    123 byte
    10.21 KiB
    1.14 MiB
    21.48 TiB

Я ошибаюсь? или что-то

1 Ответ

1 голос
/ 21 апреля 2020

Вы делитесь на биты, но ваш ввод уже в байтах, а не битах. Таким образом, за исключением вычисления <КБ, вы получите результаты, которые составляют 1/8 от ожидаемого размера. </p>

Дайте следующий код вихрем (операторы печати добавлены только для проверки работоспособности делителей):

        double KiB = Math.pow(2, 10);
        double MiB = Math.pow(2, 20);
        double GiB = Math.pow(2, 30);
        double TiB = Math.pow(2, 40);
        double Pib = Math.pow(2, 50);

        NumberFormat df = DecimalFormat.getInstance();
        System.out.println("KiB: " + df.format(KiB));
        System.out.println("MiB: " + df.format(MiB));
        System.out.println("GiB: " + df.format(GiB));
        System.out.println("TiB: " + df.format(TiB));
        System.out.println("Pib: " + df.format(Pib));

        if (size < KiB) {
            return size + " byte";

        } else if (size < MiB) {
            double result = size / KiB;
            return floatForm(result) + " KiB";

        /* remaining code is identical to yours */
...