How can I get a list of all mounted filesystems in Java on Unix?

I am running Java on Unix platform. How can I get a list of all mounted filesystems via the Java 1.6 API?

I've tried File.listRoots()

but it returns a single filesystem (i.e. /

). If I use df -h

I can see more of this:

Filesystem      Size   Used  Avail Capacity   iused     ifree %iused  Mounted on
/dev/disk0s2   931Gi  843Gi   87Gi    91% 221142498  22838244   91%   /
devfs          187Ki  187Ki    0Bi   100%       646         0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%         0         0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%         0         0  100%   /home
/dev/disk1s2   1.8Ti  926Gi  937Gi    50% 242689949 245596503   50%   /Volumes/MyBook
/dev/disk2     1.0Gi  125Mi  875Mi    13%     32014    223984   13%   /Volumes/Google Earth

      

I expect to see also /home

(at least).

+3


source to share


5 answers


Java does not provide any access to mount points. You have to run a system command mount

through Runtime.exec()

and analyze its output. Either that or parse the content /etc/mtab

.



+4


source


In Java7 +, you can use nio



import java.io.IOException;
import java.nio.file.FileStore;
import java.nio.file.FileSystems;

public class ListMountedVolumesWithNio {
   public static void main(String[] args) throws IOException {
      for (FileStore store : FileSystems.getDefault().getFileStores()) {
         long total = store.getTotalSpace() / 1024;
         long used = (store.getTotalSpace() - store.getUnallocatedSpace()) / 1024;
         long avail = store.getUsableSpace() / 1024;
         System.out.format("%-20s %12d %12d %12d%n", store, total, used, avail);
      }
   }
}

      

+9


source


You can try the following method to solve the problem:

My code

public List<String> getHDDPartitions() {
    try {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/mounts"), "UTF-8"));
        String response;
        StringBuilder stringBuilder = new StringBuilder();
        while ((response = bufferedReader.readLine()) != null) {
            stringBuilder.append(response.replaceAll(" +", "\t") + "\n");
        }
        bufferedReader.close();
        return Lists.newArrayList(Arrays.asList(stringBuilder.toString().split("\n")));
    } catch (IOException e) {
        LOGGER.error("{}", ExceptionWriter.INSTANCE.getStackTrace(e));
    }
    return null;
}

public List<Map<String, String>> getMapMounts() {
    List<Map<String, String>> resultList = Lists.newArrayList();
    for (String mountPoint : getHDDPartitions()) {
        Map<String, String> result = Maps.newHashMap();
        String[] mount = mountPoint.split("\t");
        result.put("FileSystem", mount[2]);
        result.put("MountPoint", mount[1]);
        result.put("Permissions", mount[3]);
        result.put("User", mount[4]);
        result.put("Group", mount[5]);
        result.put("Total", String.valueOf(new File(mount[1]).getTotalSpace()));
        result.put("Free", String.valueOf(new File(mount[1]).getFreeSpace()));
        result.put("Used", String.valueOf(new File(mount[1]).getTotalSpace() - new File(mount[1]).getFreeSpace()));
        result.put("Free Percent", String.valueOf(getFreeSpacePercent(new File(mount[1]).getTotalSpace(), new File(mount[1]).getFreeSpace())));
        resultList.add(result);
    }
    return resultList;
}

private Integer getFreeSpacePercent(long total, long free) {
    Double result = (Double.longBitsToDouble(free) / Double.longBitsToDouble(total)) * 100;
    return result.intValue();
}

      

+1


source


You can call the getmntent function (use "man getmntent" for more information) with JNA.

Here's some sample code to run:

import java.util.Arrays;
import java.util.List;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;

public class MntPointTest {
    public static class mntent extends Structure {
        public String mnt_fsname; //Device or server for filesystem
        public String mnt_dir; //Directory mounted on
        public String mnt_type; //Type of filesystem: ufs, nfs, etc.
        public String mnt_opts;
        public int mnt_freq;
        public int mnt_passno;

        @Override
        protected List getFieldOrder() {
            return Arrays.asList("mnt_fsname", "mnt_dir", "mnt_type", "mnt_opts", "mnt_freq", "mnt_passno");
        }
    }

    public interface CLib extends Library {
        CLib INSTANCE = (CLib) Native.loadLibrary("c", CLib.class);

        Pointer setmntent(String file, String mode);
        mntent getmntent(Pointer stream);
        int endmntent(Pointer stream);
    }

    public static void main(String[] args) {
        mntent mntEnt;
        Pointer stream = CLib.INSTANCE.setmntent("/etc/mtab", "r");
        while ((mntEnt = CLib.INSTANCE.getmntent(stream)) != null) {
            System.out.println("Mounted from: " + mntEnt.mnt_fsname);
            System.out.println("Mounted on: " + mntEnt.mnt_dir);
            System.out.println("File system type: " + mntEnt.mnt_type);
            System.out.println("-------------------------------");
        }

        CLib.INSTANCE.endmntent(stream);
    }
}

      

+1


source


I was already on my way to using mount

it when @Cozzamara pointed out that the way to go. What I ended up with:

    // get the list of mounted filesystems
    // Note: this is Unix specific, as it requires the "mount" command
    Process mountProcess = Runtime.getRuntime ().exec ( "mount" );
    BufferedReader mountOutput = new BufferedReader ( new InputStreamReader ( mountProcess.getInputStream () ) );
    List<File> roots = new ArrayList<File> ();
    while ( true ) {

        // fetch the next line of output from the "mount" command
        String line = mountOutput.readLine ();
        if ( line == null )
            break;

        // the line will be formatted as "... on <filesystem> (...)"; get the substring we need
        int indexStart = line.indexOf ( " on /" );
        int indexEnd = line.indexOf ( " ", indexStart );
        roots.add ( new File ( line.substring ( indexStart + 4, indexEnd - 1 ) ) );
    }
    mountOutput.close ();

      

0


source







All Articles