我有一个跨Java平台如何“弹出”卷?弹出/卸载/删除(取决于我们在使用哪种os语言)存储卡。

是否存在可靠的跨平台方法?

评论

不适用于标准库。您可能必须诉诸于特定于平台的黑客。您是否有任何特定的操作系统?

标准运行时库中没有例程。您将需要询问底层操作系统。

这是一些Windows命令行应用程序,请使用Process.execute进行调用。 stackoverflow.com/questions/206248/…

#1 楼

可能不是您要找的答案,但是...

否。

据我所知,还没有确定的单平台方式这个。因此,我从未遇到过Java的实现方式。相当吓人的C#CodeProject确实允许弹出设备,但只能在Windows上。

各种令人沮丧的Java USB库甚至都没有提示弹出设备。它们不能在所有平台上正常工作,所以即使这样做也无济于事。

我的建议:为每个平台添加一些脚本或可执行文件,然后仅启动一个Process作为需要。

评论


或在JNI中包装一些特定于操作系统的代码。但是我敢肯定这是“艰难的方式”。

– Peter Dolberg
09年6月26日14:57

如果性能很重要,我只会考虑JNI。如果“弹出USB”在某个地方的内部循环中,则可能值得。再说一次,这会引发……有趣的问题。

–凯文·蒙特罗斯♦
2009年6月26日15:17

#2 楼

有点迟来的反应,但我认为值得分享...
由于默认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();

}

卸下驱动器。上面的代码段绝对不适合所有应用程序,而第二个也不是最大的应用程序,还有其他比生成匿名线程更好的方法了……但是您仍然可以理解它的主意:)
最后,我恳请您适当地通知用户,并在他们的计算机上执行任何第三方软件之前询问他们的专心...
我希望这会有所帮助:-)

评论


您使用了哪个?

– KrystosTheOverlord
19年8月30日在16:17

拆卸驱动器拉链?

– KrystosTheOverlord
19年8月30日在16:18