USB Disk Ejector如何工作?

时间:2013-10-12 19:11:31

标签: java windows usb-drive

我有一个旨在在可移动驱动器上运行的Java应用程序。我想添加一个按钮,允许用户安全地删除程序在USB Disk Ejector允许的情况下运行的驱动器。但是,我不确定如何实现这一点(代码方式),因为如果程序从它运行,则无法弹出驱动器。我知道这个程序是开源的,但我不知道在哪里可以找到我正在寻找的代码,而且它不是用我学过的语言编写的。

如果有人能帮我解决如何在我的Java应用程序中实现此功能,我将非常感激。显然我不想复制,但我现在唯一知道的就是我必须将控制权传递给某种临时脚本,而这些脚本不在我想要弹出的驱动器上。

提前致谢

2 个答案:

答案 0 :(得分:0)

据我所知,在纯Java中无法实现这一点,因为弹出/卸载驱动器等操作是特定于操作系统的,并且不包含在通常仅支持最小公分母的默认Java库中。您需要通过执行脚本/批处理文件或运行本机代码来执行某些特定于平台的代码,例如:在C中使用Java的JNI机制。

答案 1 :(得分:0)

你是对的,你需要从另一个驱动器运行该应用程序。我会按照Java Web Start CD Install指南进行操作,该指南对于USB驱动器或任何其他媒体都应该像CD一样工作。

您需要使您的应用程序成为Java Web Start应用程序。它实际上比听起来容易得多;您的.jar不需要更改,您只需创建一个扩展名为.jnlp的小型XML文件,并将其放在.jar文件旁边。有关Java Web Start和JNLP文件的信息可以在the tutorial和该页面底部的链接中找到。

执行安全删除的外部可执行文件可以包含在您的应用程序.jar文件中。您可以将它从.jar复制到临时文件中以便运行它:

Path safeRemovalProgram = Files.createTempFile(null, ".exe");
try (InputStream stream =
        MyApp.class.getResourceAsStream("saferemoval.exe")) {
    Files.copy(stream, safeRemovalProgram,
        StandardCopyOption.REPLACE_EXISTING);
}
safeRemovalProgram.toFile().setExecutable(true);

ProcessBuilder builder =
    new ProcessBuilder(safeRemovalProgram.toString());
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
Process safeRemovalProcess = builder.start();