Detectar la unidad USB en Java

¿Cómo puedo detectar cuando una unidad USB está conectada a una computadora en Windows, Linux o Mac?

La única forma que he visto en línea para hacer esto es iterar las unidades, pero no creo que haya una buena manera de hacerlo multiplataforma (por ejemplo, File.listRoots () en Linux solo devuelve “/”). Incluso en Windows, esto causaría problemas para leer desde cada dispositivo, como una unidad de red que tarda mucho tiempo en acceder.

Hay una biblioteca llamada jUsb que parece que logra esto en Linux, pero no funciona en Windows. También hay una extensión para esto llamada jUsb para Windows, pero eso requiere que los usuarios instalen un archivo dll y ejecuten un archivo .reg. Ninguno de estos parece haberse desarrollado durante varios años, por lo que espero que exista una mejor solución ahora. También son excesivas para lo que necesito, cuando solo quiero detectar si un dispositivo está conectado y contiene un archivo que necesito.

[Editar] Además, al parecer, jUsb no funciona con ninguna versión reciente de Java, por lo que esta no es una opción …

Gracias

La última vez que verifiqué no había una biblioteca USB de código abierto para Java y Windows. El simple truco que utilicé fue escribir una pequeña aplicación JNI para capturar el evento WM_DEVICECHANGE . Los siguientes enlaces pueden ayudar

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

En caso de que no quiera meterse con el JNI, utilice cualquier biblioteca nativa de Windows para USB con JNA ( https://github.com/twall/jna/ )

aunque sugeriría utilizar el enfoque WM_DEVICECHANGE … porque su requisito es solo un mensaje de notificación ….

Creé una pequeña biblioteca para detectar dispositivos de almacenamiento USB en Java. Funciona en Windows, OSX y Linux. Eche un vistazo a: https://github.com/samuelcampos/usbdrivedetector

 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(); } } 

Escribí este progtwig Al comienzo del progtwig, haga DriverCheck.updateDriverInfo() . Luego, para verificar si un usb ha sido enchufado o extraído, use DriverChecker.driversChangedSinceLastUpdate() (devuelve boolean ).

Para comprobar si se ha insertado un usb, use newDriverDetected() . Para comprobar si un USB ha sido eliminado, use driverRemoved()

Esto prácticamente comprueba todas las unidades de disco de A: / a Z: /. La mitad de ellos ni siquiera pueden existir, pero de todos modos los verifico.

 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")); } } } 

Mira este código Para satisfacer sus demandas, simplemente realice una encuesta para detectar la unidad USB y continúe cuando la obtenga.

Creé el código que funciona en Linux y Windows verifique esto

  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*/ } } }