Обнаружение USB-накопителя в Java
Как определить, когда USB-накопитель подключен к компьютеру в Windows, Linux или Mac?
Единственный способ, который я видел в Интернете, - это перебирать диски, но я не думаю, что есть очень хороший способ сделать эту кросс-платформу (например, File.listRoots() в Linux возвращает только "/" ). Даже в Windows это может вызвать проблемы с чтением с любого устройства, например с сетевого диска, на который требуется много времени.
Существует библиотека под названием jUsb, которая звучит так, как будто она выполняет это в Linux, но она не работает в Windows. Существует также расширение для этого под названием jUsb для Windows, но для этого требуется, чтобы пользователи установили DLL файл и запустили .reg. Ни один из них, похоже, не разрабатывается в течение нескольких лет, поэтому я надеюсь, что теперь будет лучшее решение. Они также слишком малы для того, что мне нужно, когда я только хочу определить, подключено ли устройство, которое содержит файл, который мне нужен.
[Edit] Кроме того, jUsb, по-видимому, не работает с последней версией Java, поэтому это даже не вариант...
Спасибо
Ответы
Ответ 1
В прошлый раз, когда я проверил, нет никакой библиотеки USB с открытым исходным кодом для Java и окон. Простым взломом, который я использовал, было написать небольшое приложение JNI для захвата события WM_DEVICECHANGE
. Следующие ссылки могут помочь
Если вы не хотите связываться с JNI, используйте любую внешнюю библиотеку Windows для USB с JNA (https://github.com/twall/jna/)
altough, я бы предложил использовать подход WM_DEVICECHANGE
... потому что ваше требование - это просто уведомление...
Ответ 2
Я создал небольшую библиотеку для обнаружения USB-устройств хранения данных на Java. Он работает на Windows, OSX и Linux. Взгляните на: https://github.com/samuelcampos/usbdrivedetector
Ответ 3
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();
}
}
Ответ 4
Я написал эту программу. В начале программы сделайте 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"));
}
}
}
Ответ 5
Ознакомьтесь с этим кодом. Чтобы выполнить ваши требования, просто poll, чтобы обнаружить USB-накопитель и продолжить, когда вы его получили.
Ответ 6
Я создал код, который работает в 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*/
}
}
}