我需要在Java 5(或1.5 )中找到驱动器的总大小。我知道Java6在java.io.File中有一个新的方法,但我需要它在Java5中工作。
Apache有org.apache.commons.io.FileSystemUtils来提供空闲磁盘空间,但不提供全部磁盘空间。
我意识到这依赖于操作系统,需要依赖于混乱的命令行调用。我不介意它在“大多数”系统上工作,即windows/linux/macosx。最好是使用现有的库,而不是编写自己的变体。
有什么想法吗?谢谢。
发布于 2009-08-09 12:31:44
更新:
我很抱歉误解了这个问题,我建议复制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",您只是对"Free“左边的”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之前,没有一种优雅的方法可以做到这一点(请参阅错误)。与其自己滚动,我建议使用一个库来为您进行特定于平台的处理。
Apache commons有一个FileSystemUtils类型,它提供了一个静态方法freeSpaceKb()。它适用于Windows和一些Unix实现(参见下面Javadoc的引用)
来自Javadoc:
公共静态长freeSpaceKb(字符串路径)抛出IOException 通过调用命令行返回驱动器或卷上的空闲空间(以千字节为单位)。FileSystemUtils.freeSpaceKb("C:");// Windows FileSystemUtils.freeSpaceKb("/volume");// *nix 空闲空间是通过命令行计算的。它在Windows上使用'dir /-c‘,在AIX/HP-UX上使用'df -kP’,在其他Unix上使用'df -k‘。为了工作,您必须运行Windows,或者在传递-k (或-kP)时有一个支持GNU格式的Unix实现。如果要依赖这段代码,请通过运行一些简单的测试来比较命令行和这个类的输出,检查它是否在操作系统上工作。如果您的操作系统不受支持,请发出一个JIRA调用,详细说明df -k的确切结果以及尽可能多的其他细节,谢谢。
发布于 2009-07-15 11:13:59
备注:此解决方案只推荐作为最后一次尝试
我不知道这是否存在于任何API/库中。但是,作为最后一次尝试,我可能会创建一个脚本,或者使用任务实现来执行适合于平台的OS命令,然后解析输出流。为什么是蚂蚁?-因为它提供:
是的,这有点麻烦,但是您可以使用Ant执行上述目标,然后用自己的接口包装起来。这仍然不一定涵盖所有可能的系统--只有Ant能够识别的系统。
此外,这仍然是一项相当大的工作,您需要为所有目标平台制定正确的命令和解析策略。
同样--最后一次尝试--所以等待其他答案,然后继续搜索其他库和API产品。
https://stackoverflow.com/questions/1130660
复制相似问题