13

フラッシュ ドライブがコンピュータに接続されたことを検出する方法を探しています。これまでのところ、私が見つけた解決策は、変更をポーリング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();
        }
    }
}

この出力が得られました:

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

/* snip */

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

/media/flashdrive (/dev/sdb1)
    /dev/sdb1
    vfat

結局のところ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
4

4 に答える 4

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;
}

私の知る限り、このソリューションは Windows および Linux システムでのみ機能します。

IOExceptionCD ドライブに CD がない場合、その CD を取得しようとすると例外がスローされるため、Windows ループでをキャッチする必要がありますFileStore。これは、すべてのルートを反復処理する前に発生する可能性があります。

于 2012-05-24T20:19:53.843 に答える
0

私はJavaのこの領域を実際に調査したことはありませんが、関連していると思われるこれを見つけました。それは使用していますFile.listRoots()

そこにリンクされている関連する質問もいくつかあるようです。

于 2012-05-21T00:48:15.687 に答える
0

これは Windows で機能します。

    public Path getFileStoreRootPath(FileStore fs) throws Exception {
    for (Path root : FileSystems.getDefault().getRootDirectories()) {
        if (Files.isDirectory(root) && Files.getFileStore(root).equals(fs)) {
            return root;
        }
    }

    throw new RuntimeException("Root directory for filestore " + fs + " not found");
}

基本的に、条件によるフィルタリングによりFiles.isDirectory(root)、コンパクト ディスクが挿入されていない場合に IOException をスローするすべての CD/DVD ドライブを除外します。

于 2020-03-23T13:34:52.397 に答える