首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java查找总磁盘大小的可移植方法(pre java 6)

用Java查找总磁盘大小的可移植方法(pre java 6)
EN

Stack Overflow用户
提问于 2009-07-15 10:39:05
回答 3查看 2.8K关注 0票数 3

我需要在Java 5(或1.5 )中找到驱动器的总大小。我知道Java6在java.io.File中有一个新的方法,但我需要它在Java5中工作。

Apache有org.apache.commons.io.FileSystemUtils来提供空闲磁盘空间,但不提供全部磁盘空间。

我意识到这依赖于操作系统,需要依赖于混乱的命令行调用。我不介意它在“大多数”系统上工作,即windows/linux/macosx。最好是使用现有的库,而不是编写自己的变体。

有什么想法吗?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-09 12:31:44

更新:

我很抱歉误解了这个问题,我建议复制FileSystemUtils方法,但是稍微修改它运行的命令。

在dos中,可以使用fsutil命令获得空闲字节和总字节:

代码语言:javascript
复制
fsutil volume diskfree [drive letter]

在我的框中,这将给出以下结果:

代码语言:javascript
复制
Total # of free bytes        : 41707524096
Total # of bytes             : 80023715840
Total # of avail free bytes  : 41707524096

在Unix上,命令仍然是"df -k",您只是对"Free“左边的”1024块“列感兴趣(例如,下面的维基百科)。显然,需要将结果乘以1024。

代码语言:javascript
复制
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的输出,以获得总大小):

代码语言:javascript
复制
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()的两个调用

代码语言:javascript
复制
    /** 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的确切结果以及尽可能多的其他细节,谢谢。

票数 4
EN

Stack Overflow用户

发布于 2009-07-15 11:13:59

备注:此解决方案只推荐作为最后一次尝试

我不知道这是否存在于任何API/库中。但是,作为最后一次尝试,我可能会创建一个脚本,或者使用任务实现来执行适合于平台的OS命令,然后解析输出流。为什么是蚂蚁?-因为它提供:

  • 良好的平台标识(请参阅os条件)
  • 平台无关命令执行
  • 能够以编程方式解析命令执行的输出--将输出写入属性,然后从Ant 项目对象访问输出。

是的,这有点麻烦,但是您可以使用Ant执行上述目标,然后用自己的接口包装起来。这仍然不一定涵盖所有可能的系统--只有Ant能够识别的系统。

此外,这仍然是一项相当大的工作,您需要为所有目标平台制定正确的命令和解析策略。

同样--最后一次尝试--所以等待其他答案,然后继续搜索其他库和API产品。

票数 1
EN

Stack Overflow用户

发布于 2009-08-10 20:34:27

这里在太阳上有一个很长的历史上的自由磁盘空间问题。他们提到JConfig是一种可能的解决方案。不幸的是,这个库只能在2009年底(希望如此)才能到达,现在还不清楚它是否解决了您原来的问题,因为没有文档和源代码,但是它们声明:

它允许您以比标准Java类库更高级的方式处理文件、web浏览器、进程、文件类型和其他系统级别的项。例如,您可以使用它来启动web浏览器或其他外部应用程序,而不是使用只在一个平台上工作的Runtime.exec或解决方案。

所以如果你有耐心和幸运..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1130660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档