Обновление:
Я прошу прощения за неправильное прочтение вопроса, я рекомендую скопировать подход 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 и как можно больше других деталей, спасибо.