2013-10-12 39 views
0

我有一個Java應用程序,旨在運行在可移動驅動器上。我想添加一個按鈕以允許用戶安全地移除程序運行的驅動器,因爲USB Disk Ejector允許。但是,我不知道如何實現這個(代碼明智的),因爲如果程序正在運行,驅動器不能被彈出。我知道這個程序是開源的,但我不知道在哪裏可以找到我正在尋找的代碼,並且它不是用我學過的語言編寫的。USB磁盤彈出器如何工作?

因此,如果有人能夠幫助我解決如何在Java應用程序中實現此功能,我將非常感激。顯然,我不想複製,但是我現在唯一知道的是我必須將控制權交給某種不在我希望彈出的驅動器上的臨時腳本。

在此先感謝

回答

0

據我所知,這是不可能的純Java實現這個作爲如彈出/卸載驅動器操作的操作系統特定的,不包括在默認的Java庫,通常只支持最低公分母。您需要通過執行腳本/批處理文件或運行編寫的本機代碼來執行某些平臺特定的代碼。在C中使用Java的JNI機制。

+0

我有一個可執行文件,讓我安全地移除通過命令行,我計劃從臨時文件運行驅動器。然而,問題是我不知道如何運行可執行文件,因爲在應用程序運行時驅動器不能被彈出。我需要以某種方式啓動一個腳本,等待主應用程序退出,然後嘗試安全地移除驅動器,但(代碼方面)我不確定如何執行此操作 – Andy

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(); 
+0

謝謝您的回答。我理解這個概念,並且我認爲它可以工作,但是我認爲Web Start會損害我的應用程序的圖像和可移植性,因爲我希望它被包裝爲'exe'並從可移動驅動器運行。我猜測通過使用Web Start,實際上沒有任何東西從驅動器運行? – Andy

+0

CD Install鏈接描述瞭如何製作install.bat(或setup.bat等)。如果需要,我想你甚至可以使它與Autorun一起工作。但是我承認,它不會像單個可點擊的可執行文件那樣具有相同的易用性。 Web Start通常(總是?)緩存應用程序,但我不知道它是否會繼續保留原始未導入的.jar文件鎖定在Windows中。 – VGR