我在Unix平台上运行Java。 我如何通过Java 1.6 API获得所有已挂载文件系统的列表?
我试过File.listRoots()
但返回一个单一的文件系统(即, /
)。 如果我使用df -h
我看到的不仅仅是:
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
我也希望能看到/home
(至less)。
Java不提供对挂载点的任何访问。 您必须通过Runtime.exec()
运行系统命令mount
并解析其输出。 要么是,要么解析/etc/mtab
。
在Java7 +中,你可以使用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); } } }
您可以尝试使用跟踪方法解决问题:
我的代码
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(); }
您可以使用JNA调用getmntent函数(使用“man getmntent”获取更多信息)。
下面是一些示例代码,以帮助您开始:
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); } }
当@Cozzamara指出这是要走的时候,我已经在使用mount
了。 结果是:
// 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 ();