Определить USB-накопитель в Java - PullRequest
21 голосов
/ 30 сентября 2010

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

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

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

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

Спасибо

Ответы [ 6 ]

12 голосов
/ 24 марта 2014

Я создал небольшую библиотеку для обнаружения USB-устройств хранения данных на Java. Работает на Windows, OSX и Linux. Взгляните на: https://github.com/samuelcampos/usbdrivedetector

8 голосов
/ 21 февраля 2015
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();
}
}
8 голосов
/ 01 октября 2010

В прошлый раз, когда я проверял, не было библиотеки USB с открытым исходным кодом для Java и Windows. Простым хаком, который я использовал, было написать небольшое приложение 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, используйте любую собственную Windows-библиотеку для USB с JNA (https://github.com/twall/jna/)

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

0 голосов
/ 12 апреля 2017

Проверьте этот код.Чтобы удовлетворить ваши требования, просто опрос , чтобы обнаружить USB-накопитель и продолжить, когда вы его получили.

0 голосов
/ 18 сентября 2015

Я написал эту программу.В начале программы выполните 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 голосов
/ 13 августа 2015

Я создал код, который работает в 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*/
           }

      }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...