找到FileStore的目录

Jef*_*rey 11 java nio2

我正试图找到一种方法来检测闪存驱动器何时插入我的计算机.到目前为止,我发现的解决方案是轮询FileSystem#getFileStores更改.这确实告诉我什么时候插入了闪存驱动器,但据我所知,没有办法检索它的位置.FileStore#type并且FileStore#name它们看起来都非常不可靠,因为它们的返回值是特定于实现的,但它们似乎是唯一可能返回任何可能有助于查找目录的相关信息的方法FileStore.

考虑到这一点,以下代码:

public class Test {
    public static void main(String[] args) throws IOException {
        for (FileStore store : FileSystems.getDefault().getFileStores()) {
            System.out.println(store);
            System.out.println("\t" + store.name());
            System.out.println("\t" + store.type());
            System.out.println();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

给我这个输出:

/ (/dev/sda5)
    /dev/sda5
    ext4

/* snip */

/media/TI103426W0D (/dev/sda2)
    /dev/sda2
    fuseblk

/media/flashdrive (/dev/sdb1)
    /dev/sdb1
    vfat
Run Code Online (Sandbox Code Playgroud)

事实证明,FileStore#type返回驱动器的格式并FileStore#name返回驱动器的设备文件的位置.据我所知,唯一具有驱动器位置的toString方法是方法,但从中提取路径名称似乎很危险,因为我不确定该特定解决方案在其他操作系统上的表现如何Java的未来版本.

有没有我在这里缺少的东西,或者纯粹用Java是不可能的?

系统信息:

$ java -version
java version "1.7.0_03"
OpenJDK Runtime Environment (IcedTea7 2.1.1pre) (7~u3-2.1.1~pre1-1ubuntu2)
OpenJDK Client VM (build 22.0-b10, mixed mode, sharing)

$ uname -a
Linux jeffrey-pc 3.2.0-24-generic-pae #37-Ubuntu SMP Wed Apr 25 10:47:59 UTC 2012 i686 athlon i386 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

Jef*_*rey 10

这是一个临时工作,直到找到更好的解决方案:

public Path getRootPath(FileStore fs) throws IOException {
    Path media = Paths.get("/media");
    if (media.isAbsolute() && Files.exists(media)) { // Linux
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(media)) {
            for (Path p : stream) {
                if (Files.getFileStore(p).equals(fs)) {
                    return p;
                }
            }
        }
    } else { // Windows
        IOException ex = null;
        for (Path p : FileSystems.getDefault().getRootDirectories()) {
            try {
                if (Files.getFileStore(p).equals(fs)) {
                    return p;
                }
            } catch (IOException e) {
                ex = e;
            }
        }
        if (ex != null) {
            throw ex;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,此解决方案仅适用于Windows和Linux系统.

您必须IOException在Windows循环中捕获,因为如果CD驱动器中没有CD,则在尝试检索FileStore它时会引发异常.在迭代每个根之前可能会发生这种情况.