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

后端 未结 6 1027
误落风尘
误落风尘 2020-12-10 19:38

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

I\'ve tried File.listRoots() but that return

相关标签:
6条回答
  • 2020-12-10 19:48

    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);
          }
       }
    }
    
    0 讨论(0)
  • 2020-12-10 19:57

    You can try use follow method for resolve issue:

    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();
    }
    
    0 讨论(0)
  • 2020-12-10 20:01

    You can call the getmntent function (use "man getmntent" to get more information) using JNA.

    Here is some example code to get you started:

    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);
        }
    }
    
    0 讨论(0)
  • 2020-12-10 20:01

    I was already on the way to using mount when @Cozzamara pointed out that's the way to go. What I ended up with is:

        // 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 讨论(0)
  • 2020-12-10 20:04

    OSHI (Operating System and Hardware Information library for Java) can be useful here: https://github.com/oshi/oshi.

    Check out this code:

    @Test
    public void test() {
    
        final SystemInfo systemInfo = new SystemInfo();
        final OSFileStore[] fileStores = systemInfo.getOperatingSystem().getFileSystem().getFileStores();
        Stream.of(fileStores)
        .peek(fs ->{
            System.out.println("name: "+fs.getName());
            System.out.println("type: "+fs.getType() );
            System.out.println("str: "+fs.toString() );
            System.out.println("mount: "+fs.getMount());
            System.out.println("...");
        }).count();
    
    }
    
    0 讨论(0)
  • 2020-12-10 20:09

    Java doesn't provide any access to mount points. You have to run system command mount via Runtime.exec() and parse its output. Either that, or parse the contents of /etc/mtab.

    0 讨论(0)
提交回复
热议问题