一个Java程序如何列出所有的分区并获得Linux上的可用空间?

xoefb8l8  于 2023-01-11  发布在  Java
关注(0)|答案(4)|浏览(310)

我想与他们的总空间分区的名称,已用空间和使用Java程序的Linux系统的可用空间。
在Windows系统中,我得到了正确的值,但在Linux中,我只得到了一个驱动器信息:
以下是我目前所做的尝试。

public class DiskSpace {

public static void main(String[] args) {
    FileSystemView fsv = FileSystemView.getFileSystemView();
    File[] drives = File.listRoots();
    if (drives != null && drives.length > 0) {
        for (File aDrive : drives) {
            System.out.println("Drive Letter: " + aDrive);
            System.out.println("\tType: " + fsv.getSystemTypeDescription(aDrive));
            System.out.println("\tTotal space: " + aDrive.getTotalSpace());
            System.out.println("\tFree space: " + aDrive.getFreeSpace());
            System.out.println();
        }
    }
}
vyswwuz2

vyswwuz21#

Linux上没有驱动器号。如果您想知道有哪些分区以及它们安装在哪里,请读取/proc/mounts。当您有一个安装点(/proc/mounts中的第2列)时,请使用new File(mountpoint).getTotalSpace()来获取总空间。

rqdpfwrv

rqdpfwrv2#

Linux、Unix和类Unix系统具有一个文件系统,该文件系统具有一个根,在根内可以有多个挂载点,可以在这些挂载点挂载包含Unix文件系统的分区(部分或完整)-,也可以使用可用于处理必要转换的适当软件挂载非Unix文件系统,但是统一的单根文件系统模型仍然存在。
如果您使用的FileSystemView类来自javax.swing.filechooser包,不要期望太高:
FileSystemView是JFileChooser访问文件系统的网关,由于JDK1.1 File API不允许访问根分区、文件类型信息或隐藏文件位等信息,该类旨在尽可能直观地了解特定于操作系统的文件系统信息。
Java许可证持有者可能希望提供FileSystemView的不同实现,以更好地处理给定的操作系统。
第二段是关键。
Java的虚拟机实现是为了抽象出你在这种情况下想要的特定于平台的东西。为了成功,你需要为你将要支持的每个平台的本地系统API编写或找到本地调用 Package 器类。像FileSystemView类这样的“高级”抽象不太可能完整或可靠地提供你需要的信息。

a9wyjsp7

a9wyjsp73#

这是一个代码段,用于仅显示已装载外部介质的名称。

String OS = System.getProperty("os.name");
if(OS.equals("Linux"))
{
    String s = "";
    Runtime rt = Runtime.getRuntime();
    int n=0;
    Process ps = rt.exec("ls /run/media/Rancho");// Write your UserName, mine is Rancho

    InputStream in = ps.getInputStream();
    while((n = in.read())!=-1)
    {
        char ch = (char) n;
        s+ = ch;
    }
    System.out.println(s);  
}
t5fffqht

t5fffqht4#

我知道我来晚了,但我写了一个类,它只是完成它的工作,它所做的是阅读/proc/mounts文件,将其解析到Block Device中(如/dev/sda),挂载点,文件系统类型及其挂载选项。如果你不需要我写的额外的东西,你可以排除它,但对于我正在工作的项目,我想包括它,例如当前用户是否可以写入当前挂载点或从当前挂载点读取。

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class UnixPartition {

    private final String block, mount, fsType, mntOptions;
    private final long totalSpace, freeSpace, usableSpace;
    private final File root;

    protected UnixPartition(String block, String mount, String fsType, String mountOptions, long totalSpace, long freeSpace, long usableSpace, File root) {
        this.block = block;
        this.mount = mount;
        this.fsType = fsType;
        this.mntOptions = mountOptions;
        this.totalSpace = totalSpace;
        this.freeSpace = freeSpace;
        this.usableSpace = usableSpace;
        this.root = root;
    }

    public String getBlock() {
        return block;
    }

    public String getMount() {
        return mount;
    }

    public String getFilesystemType() {
        return fsType;
    }

    public long getTotalSpace() {
        return totalSpace;
    }

    public long getFreeSpace() {
        return freeSpace;
    }

    public long getUsableSpace() {
        return usableSpace;
    }

    public String getMountOptions() {
        return mntOptions;
    }

    public boolean canCurrentUserWrite() {
        return root.canWrite();
    }

    public boolean canCurrentUserRead() {
        return root.canRead();
    }

    private String getLineSeparator(String contents) {
        char[] chars = contents.toCharArray();

        long r = 0;
        long n = 0;

        for (char c : chars) {
            if (c == '\r')
                r++;

            if (c == '\n')
                n++;
        }

        if (r == n)
            return "\r\n";
        else if (r >= 1 && n == 0)
            return "\r";
        else if (n >= 1 && r == 0)
            return "\n";
        else
            return "";
    }

    public static List<UnixPartition> getPartitions(boolean filterSpecials) throws IOException {
        String contents = new String(FileUtil.read("/proc/mounts"));
        String[] lines = contents.split(getLineSeparator(contents));

        List<UnixPartition> partitions = new ArrayList<>();

        for (String line : lines) {
            StringTokenizer tokenizer = new StringTokenizer(line, " ");
            String blk = tokenizer.nextToken(),
                    mnt = tokenizer.nextToken(),
                    type = tokenizer.nextToken(),
                    opt = tokenizer.nextToken();

            if (filterSpecials) {
                if ((blk.contains("proc") || mnt.contains("proc") || type.contains("proc")) ||
                        (blk.contains("systemd") || mnt.contains("systemd") || type.contains("systemd")) ||
                        (blk.contains("binmft_misc") || mnt.contains("binmft_misc") || type.contains("binmft_misc")) ||
                        (blk.contains("udev") || mnt.contains("udev") || type.contains("udev")) ||
                        (blk.contains("devpts") || mnt.contains("devpts") || type.contains("devpts")) ||
                        (blk.contains("fuse") || mnt.contains("fuse") || type.contains("fuse")) ||
                        (blk.contains("pstore") || mnt.contains("pstore") || type.contains("pstore")) ||
                        type.contains("tmp"))
                    continue;

                if (blk.contains("none"))
                    continue;
            }

            File root = new File(mnt);

            partitions.add(new UnixPartition(blk, mnt, type, opt,
                    root.getTotalSpace(), root.getFreeSpace(), root.getUsableSpace(), root));
        }

        return partitions;
    }

}

编辑:您可能想自己过滤掉特殊的挂载类型,因为我刚刚在这里使用了另一个答案中的挂载类型。

相关问题