4

如何使用 Java 跨平台“弹出”卷?

我有一个程序可以在可移动驱动器(USB 存储卡读卡器)上执行一些操作,一旦完成,我希望程序弹出/卸载/删除(取决于我们正在谈论的操作系统术语)存储卡。

是否有可靠的跨平台方法来执行此操作?

4

2 回答 2

2

可能不是您正在寻找的答案,但是...

不。

据我所知,没有一种既定的单一平台方式可以做到这一点。就此而言,我从未遇到过这样做的 Java 方式。一个相当可怕的 C# CodeProject确实允许弹出设备,但仅限于 Windows。

各种令人沮丧的Java USB 库甚至没有提示弹出设备。它们并不适用于所有平台,因此即使它们这样做也无济于事。

我的建议:为每个平台编写一些脚本或可执行文件,然后根据需要启动一个进程。

于 2009-06-26T13:33:01.660 回答
0

回复有点晚,但我认为值得分享...由于默认的 Java API 没有此功能,您可以使用上面提到的外部库,但我个人发现它更方便(对于 Windows)在 jar 的类路径中有一个第三方 exe 文件,将其解压缩到 temp 文件夹中,在需要时执行它,然后在应用程序完成后将其删除。作为第三方程序,我使用了这个仅 CLI 的程序,可以对连接的设备执行一些技巧,然后使用以下代码:

FileUtils.copyInputStreamToFile(MyClass.class.getClassLoader().getResourceAsStream(program),TEMP_EJECT_PROGRAM);

将其导出到临时文件位置(使用 ApacheIO,您肯定可以不使用它),并且此代码:

    private void safelyRemoveDrive(final String driveLetter) {
    new Thread(new Runnable() {
        public void run() {
            if (TEMP_EJECT_PROGRAM.exists()) {
                System.out.println("Removing " + driveLetter);
                try {
                    Process p = Runtime.getRuntime()
                            .exec("\"" + TEMP_EJECT_PROGRAM.toString() + "\" " + driveLetter + " -L");
                    p.waitFor();
                    Scanner s = new Scanner(p.getInputStream());
                    while (s.hasNextLine())
                        System.out.println(s.nextLine());
                    s.close();
                    System.out.println("Removed " + driveLetter + ".");
                } catch (IOException | InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();

}

卸下驱动器。上面的代码片段肯定不适合所有应用程序,特别是第二个不是最好的,还有其他比产生匿名线程更好的方法......但是你仍然明白它背后的想法:)

最后,我建议您在他们的机器上执行任何第三方软件之前适当地通知用户并询问他们的意见......

我希望这可以帮到你 :-)

于 2017-06-26T15:03:47.957 回答