Портативный способ определения общего размера диска в Java (до Java 6) - PullRequest
3 голосов
/ 15 июля 2009

Мне нужно найти общий размер диска в Java 5 (или 1,5, что угодно). Я знаю, что в Java 6 появился новый метод в java.io.File, но он мне нужен для работы в Java 5.

В Apache Commons IO есть org.apache.commons.io.FileSystemUtils для предоставления свободного дискового пространства, но не общего дискового пространства.

Я понимаю, что это зависит от ОС и должно зависеть от грязного вызова командной строки. Я в порядке, когда он работает на «большинстве» систем, то есть windows / linux / macosx. Желательно, чтобы я использовал существующую библиотеку, а не писал свои собственные варианты.

Есть мысли? Спасибо.

Ответы [ 3 ]

4 голосов
/ 09 августа 2009

Обновление:

Я прошу прощения за неправильное прочтение вопроса, я рекомендую скопировать подход FileSystemUtils, но при изменении команд он работает незначительно.

В DOS вы можете получить свободный и общий байт с помощью команды fsutil:

fsutil volume diskfree [drive letter]

на моей коробке это дает следующие результаты:

Total # of free bytes        : 41707524096
Total # of bytes             : 80023715840
Total # of avail free bytes  : 41707524096

В Unix команда по-прежнему "df -k", вам просто интересен столбец "1024-блока" слева от "Свободно" (пример из Википедии ниже). Очевидно, вам нужно умножить результат на 1024.

Filesystem    1024-blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4            32768     16016   52%     2271    14% /
/dev/hd2          4587520   1889420   59%    37791     4% /usr
/dev/hd9var         65536     12032   82%      518     4% /var
/dev/hd3           819200    637832   23%     1829     1% /tmp
/dev/hd1           524288    395848   25%      421     1% /home
/proc                   -         -    -         -     -  /proc
/dev/hd10opt        65536     26004   61%      654     4% /opt

Предполагается, что вы скопировали FileSystemUtils для реализации "totalSpaceKB ()", чтобы делегировать эквивалентный специфичный для ОС метод. Реализация для Windows будет выглядеть примерно так (обратите внимание на использование «Find» для обрезки вывода из fsutil, чтобы просто получить общий размер):

long totalSpaceWindows(String path) throws IOException {
    path = FilenameUtils.normalize(path);
    if (path.length() > 2 && path.charAt(1) == ':') {
        path = path.substring(0, 2); // seems to make it work
    }

    // build and run the 'fsutil' command
    String[] cmdAttribs = new String[] {
            "cmd.exe",
            "/C",
            "fsutil volume diskfree " + path
                    + " | Find \"Total # of bytes\"" };

    // read in the output of the command to an ArrayList
    List lines = performCommand(cmdAttribs, Integer.MAX_VALUE);

    //because we used Find, we expect the first line to be "Total # of bytes",
    //you might want to add some checking to be sure
    if (lines.size() > 0) {
        String line = (String) lines.get(0);
        String bytes = line.split(":")[1].trim();
        return Long.parseLong(bytes);
    }
    // all lines are blank
    throw new IOException(
            "Command line 'fsutil volume diskfree' did not return 
                    + "any info  for path '" + path + "'");
}

Реализация для Unix будет такой же, как freeSpaceUnix (), но удалит два вызова tok.nextToken () в конце метода

    /** comment these two lines so the token received is the total size */
    tok.nextToken(); // Ignore 1K-blocks
    tok.nextToken(); // Ignore Used
    /** this will now be the total size */
    String freeSpace = tok.nextToken();
    return parseBytes(freeSpace, path);
}

Реализации для других платформ будут аналогичными.

Надеюсь, это поможет и принесет извинения за неправильное прочтение проблемы.


Оригинальный ответ (получает свободные байты, а не всего).

До Java 6 не было элегантного способа сделать это (см. bug ). Вместо того, чтобы использовать свою собственную, я бы порекомендовал использовать библиотеку для выполнения обработки для конкретной платформы.

Apache commons-io имеет тип FileSystemUtils , который предоставляет статический метод freeSpaceKb (). Он работает в Windows и некоторых реализациях Unix (см. Цитату из Javadoc ниже)

Из Javadoc:

public static long freeSpaceKb (String path) выдает IOException

Возвращает свободное место на диске или том в килобайтах, вызывая командную строку. FileSystemUtils.freeSpaceKb ( "C:"); // Windows FileSystemUtils.freeSpaceKb ( "/ объем"); // * nix

Свободное пространство вычисляется через командную строку. Он использует «dir / -c» в Windows, «df -kP» в AIX / HP-UX и «df -k» в других Unix. Для того, чтобы работать, вы должны работать под управлением Windows или иметь реализацию Unix df, которая поддерживает формат GNU при передаче -k (или -kP). Если вы собираетесь полагаться на этот код, убедитесь, что он работает в вашей ОС, запустив несколько простых тестов для сравнения командной строки с выходными данными этого класса. Если ваша операционная система не поддерживается, пожалуйста, вызовите вызов JIRA с подробным описанием точного результата из df -k и как можно больше других деталей, спасибо.

1 голос
/ 15 июля 2009

Примечание: Это решение рекомендуется только как последняя попытка рва

Я не знаю, существует ли это в каком-либо API / библиотеке. Однако в качестве последней попытки рва я бы, вероятно, создал сценарий Ant или использовал бы реализации задач Ant для выполнения команды ОС, соответствующей платформе, а затем проанализировал поток вывода. Почему муравей? - потому что это обеспечивает:

  • Хорошая идентификация платформы (см. Состояние ОС )
  • Платформа не зависит Выполнение команды
  • Возможность программно анализировать выходные данные выполнения команд - записав выходные данные в свойство и затем получив доступ к нему из объекта Ant project .

Да, это немного грязно, но вы можете выполнить указанную цель с помощью Ant API, а затем обернуть все это своим собственным интерфейсом. Это все еще не обязательно охватывает все возможные системы - только те, которые Ant может идентифицировать.

Кроме того, это все еще трудоемкая работа, вам нужно будет разработать правильные команды и стратегии синтаксического анализа для всех ваших целевых платформ.

Опять же - последняя попытка отказа - так что ждите других ответов и продолжайте поиск других библиотек и предложений API.

0 голосов
/ 11 августа 2009

Здесь в SUN существует длинная история проблемы свободного дискового пространства. Они упоминают JConfig в качестве возможного решения. К сожалению, эта библиотека может быть доступна только в конце лета 2009 года (надеюсь), и теперь неясно, решит ли она вашу исходную проблему, поскольку документация и источник недоступны, но они утверждают, что:

Позволяет работать с файлами, в Интернете. браузеры, процессы, типы файлов и другие элементы системного уровня в гораздо более продвинутый способ, чем это обеспечивается стандартным классом Java библиотеки. Например, вы можете использовать это запустить веб-браузеры или другие внешние приложения вместо использования Runtime.exec или решения, которые только работа на одной платформе.

Так что, если вы терпеливы и удачливы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...