通过解析df命令内容实现, 获取以下信息:

[root@localhost ~]# dfFilesystem     1K-blocks      Used Available Use% Mounted ondevtmpfs        16324812         0  16324812   0% /devtmpfs           16342248         0  16342248   0% /dev/shmtmpfs           16342248    271464  16070784   2% /runtmpfs           16342248         0  16342248   0% /sys/fs/cgroup/dev/sda3      451151536 201744672 226419856  48% //dev/sda1         999320    169864    760644  19% /boottmpfs            3268448         0   3268448   0% /run/user/0

实现代码:

import lombok.Data;import lombok.extern.slf4j.Slf4j;import org.apache.commons.io.IOUtils;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.nio.charset.StandardCharsets;import java.util.ArrayList;import java.util.List;@Slf4jpublic class DiskUtils {    @Data    public static class Df {        private String filesystem;        private String blocks;        /** 已应用 */        private long used;        /** 残余可用 */        private long available;        /** 已使用率, 0-100的整数值 */        private int useRate;        /** 挂载目录, '/'示意挂载在根目录 */        private String mountedOn;    }    public static Df df(String dir) {        switch (OS.platform()) {            case WINDOWS:                Df df = new Df();                df.setAvailable(Long.MAX_VALUE);                return df;        }        Process process;        try {            log.debug("df " + dir);            process = Runtime.getRuntime().exec("df " + dir);            InputStream inputStream = process.getInputStream();            // Filesystem      1K-blocks       Used Available Use% Mounted on            // /dev/sdc       5814186096 5814169712         0 100% /home/spy-sd/sdc            List<String> lines = IOUtils.readLines(inputStream, StandardCharsets.UTF_8);            List<String> titles = getTitles(lines.get(0));            String[] values = lines.get(1).split("\\s+");            Df df = new Df();            for(int i = 0; i < titles.size(); i ++) {                String title = titles.get(i);                switch (title.toLowerCase()) {                    case "filesystem": df.setFilesystem(values[i]);break;                    case "1k-blocks": df.setBlocks(values[i]);break;                    case "used": df.setUsed(Long.parseLong(values[i]));break;                    case "available": df.setAvailable(Long.parseLong(values[i]));break;                    case "use%": df.setUseRate(Integer.parseInt(values[i].replace("%", "")));break;                    case "mountedon": df.setMountedOn(values[i]);break;                }            }            return df;        } catch (IOException e) {            e.printStackTrace();            return null;        }    }    private static List<String> getTitles(String titlesLine) {        List<String> titles = new ArrayList<>();        String[] titleArray = titlesLine.split("\\s+");        for(String title: titleArray) {            if(title.equalsIgnoreCase("on")) {                if(!titles.isEmpty()) {                    int lastIdx = titles.size() - 1;                    titles.set(lastIdx, titles.get(lastIdx) + "On");                }            } else {                titles.add(title);            }        }        return titles;    }    public static void main(String[] args) {        Df df = df(new File("/home/spy-sd/sdc").getAbsolutePath());        log.debug("df={}", df);    }}

Df数据示例:

DiskUtils.Df(filesystem=/dev/sdc, blocks=5814186096, used=1652962708, available=3868180876, useRate=30, mountedOn=/home/spy-sd/sdc)