2010-09-30 2 views
21

Как определить, когда USB-накопитель подключен к компьютеру в Windows, Linux или Mac?Обнаружение USB-накопителя в Java

Единственный способ, которым я видел это в Интернете, - это перебирать диски, но я не думаю, что есть очень хороший способ сделать это кросс-платформенное (например, File.listRoots() в Linux возвращает только "/"). Даже в Windows это может вызвать проблемы с чтением с любого устройства, например с сетевого диска, на который требуется много времени.

Существует библиотека под названием jUsb, которая звучит так, как будто она выполняет это в Linux, но она не работает в Windows. Существует также расширение для этого под названием jUsb для Windows, но для этого требуется, чтобы пользователи установили DLL-файл и запустили .reg. Ни один из них, похоже, не разрабатывается в течение нескольких лет, поэтому я надеюсь, что теперь будет лучшее решение. Они также слишком завышены для того, что мне нужно, когда я только хочу определить, подключено ли устройство, которое содержит файл, который мне нужен.

[править] Кроме того, jUsb по-видимому, не работает с любой последней версии Java, так что это даже не вариант ...

Благодаря

ответ

8

Последний раз я проверил там не было никакого открытого исходная USB-библиотека для Java и окон. Простым хаком, который я использовал, было написать небольшое приложение JNI для захвата события WM_DEVICECHANGE. Эти ссылки могут помочь

  1. http://www.codeproject.com/KB/system/DriveDetector.aspx
  2. http://msdn.microsoft.com/en-us/library/aa363480(v=VS.85).aspx

В случае, если вы не хотите возиться с JNI затем использовать любые окна нативную библиотеку для USB с ЮНА (https://github.com/twall/jna/)

хотя я бы предложил использовать метод WM_DEVICECHANGE ... потому что ваше требование - это только сообщение уведомления ....

8
public class AutoDetect { 

static File[] oldListRoot = File.listRoots(); 
public static void main(String[] args) { 
    AutoDetect.waitForNotifying(); 

} 

public static void waitForNotifying() { 
    Thread t = new Thread(new Runnable() { 
     public void run() { 
      while (true) { 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       if (File.listRoots().length > oldListRoot.length) { 
        System.out.println("new drive detected"); 
        oldListRoot = File.listRoots(); 
        System.out.println("drive"+oldListRoot[oldListRoot.length-1]+" detected"); 

       } else if (File.listRoots().length < oldListRoot.length) { 
    System.out.println(oldListRoot[oldListRoot.length-1]+" drive removed"); 

        oldListRoot = File.listRoots(); 

       } 

      } 
     } 
    }); 
    t.start(); 
} 
} 
+1

Второй абзац вопроса конкретно описывает, почему этот подход не нужен. – VGR

-1

Я создал код, который работает на Linux и Windows, проверить это

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class Main{ 
public static void main(String[] args) throws IOException{//main class 
    Main m = new Main();//main method 
    String os = System.getProperty("os.name").toLowerCase();//get Os name 
    if(os.indexOf("win") > 0){//checking if os is *nix or windows 
     //This is windows 
     m.ListFiles(new File("/storage"));//do some staf for windows i am not so sure about '/storage' in windows 
     //external drive will be found on 
    }else{ 
     //Some *nix OS 
     //all *nix Os here 
     m.ListFiles(new File("/media"));//if linux removable drive found on media 
     //this is for Linux 

    } 


} 

void ListFiles(File fls)//this is list drives methods 
      throws IOException { 
    while(true){//while loop 


try { 
    Thread.sleep(5000);//repeate a task every 5 minutes 
} catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
    Process p = Runtime.getRuntime().exec("ls "+fls);//executing command to get the output 
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));//getting the output 
      String line;//output line 
       while((line = br.readLine()) != null){//reading the output 
       System.out.print("removable drives : "+line+"\n");//printing the output 
      } 
      /*You can modify the code as you wish. 
      * To check if external storage drivers pluged in or removed, compare the lenght 
      * Change the time interval if you wish*/ 
      } 

     } 
} 
+0

Это совершенно неправильно для Windows, он бесконечно петляет и ничего не делает ... – BullyWiiPlaza

0

Я написал эту программу. В начале программы сделайте DriverCheck.updateDriverInfo(). Затем, чтобы проверить, был ли USB-кабель вставлен в или вытащен, используйте DriverChecker.driversChangedSinceLastUpdate() (возвращается boolean).

Чтобы проверить, было ли установлено USB-устройство, используйте newDriverDetected(). Чтобы проверить, было ли удалено usb, используйте driverRemoved()

Это довольно хорошо проверяет все диски от A:/до Z: /. Половина из них даже не может существовать, но я все равно проверяю их всех.

package security; 

import java.io.File; 

public final class DriverChecker { 
    private static boolean[] drivers = new boolean[26]; 

    private DriverChecker() { 

    } 

    public static boolean checkForDrive(String dir) { 
     return new File(dir).exists(); 
    } 

    public static void updateDriverInfo() { 
     for (int i = 0; i < 26; i++) { 
      drivers[i] = checkForDrive((char) (i + 'A') + ":/"); 
     } 
    } 

    public static boolean newDriverDetected() { 
     for (int i = 0; i < 26; i++) { 
      if (!drivers[i] && checkForDrive((char) (i + 'A') + ":/")) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public static boolean driverRemoved() { 
     for (int i = 0; i < 26; i++) { 
      if (drivers[i] && !checkForDrive((char) (i + 'A') + ":/")) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public static boolean driversChangedSinceLastUpdate() { 
     for (int i = 0; i < 26; i++) { 
      if (drivers[i] != checkForDrive((char) (i + 'A') + ":/")) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public static void printInfo() { 
     for (int i = 0; i < 26; i++) { 
      System.out.println("Driver " + (char) (i + 'A') + ":/ " 
        + (drivers[i] ? "exists" : "does not exist")); 
     } 
    } 
} 
0

Отъезд this код. Чтобы выполнить ваши требования, просто poll, чтобы обнаружить USB-накопитель и продолжить, когда вы его получили.

Смежные вопросы