reconocer pulsos puertos puerto programacion por para mas manejo mandar interfaz genérica energia electrónicos dispositivos detectar desde con comunicación como java

pulsos - Detectar la unidad USB en Java



manejo de puertos en java (6)

Echa un vistazo a this código. Para satisfacer sus demandas, simplemente poll para detectar la unidad USB y continúe cuando la obtuvo.

¿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 en la lectura de todos los dispositivos, como una unidad de red a la que se tarda mucho tiempo en acceder.

Hay una biblioteca llamada jUsb que parece que lo logra 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 haber sido desarrollado durante varios años, así 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


Escribí este programa. Al comienzo del programa, haga DriverCheck.updateDriverInfo() . Luego, para verificar si un USB ha sido conectado o desconectado, use DriverChecker.driversChangedSinceLastUpdate() (devuelve boolean ).

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


He creado el código que funciona en Linux y Windows compruebe 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*/ } } }



La última vez que verifiqué no había ninguna biblioteca USB de código abierto para Java y Windows. El truco simple 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, use cualquier biblioteca nativa de Windows para USB con JNA ( https://github.com/twall/jna/ )

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


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