Java使用file.listFiles()检测Ubuntu中的pendrive

时间:2014-10-28 09:22:36

标签: java ubuntu usb-drive

我正在使用一个线程来检查pendrive是否被锥形化,在两个状态之间切换EMPTY / READY

@Override
public void run() {
    running = true;
    while(running){ // forever
        try {
            Delay.of_1second();
            drivePath = getDrivePath(rootPath);
            if (isReady() && drivePath==null){
                notifyNewState(DriveState.EMPTY);
            }
            else if (!isReady() && drivePath!=null){
                notifyNewState(DriveState.READY);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

private String getDrivePath(String rootPath){
    File file = new File(rootPath);
    if (SystemUtils.IS_OS_WINDOWS){
        return file.exists() ? rootPath : null;
    }
    else{
        for (File f : file.listFiles()){
            if (!f.getName().equalsIgnoreCase("CDROM")){
                return f.getAbsolutePath(); // we return the first folder other than 'CDROM'
            }
        }
    }
    return null;
}

它在Windows中使用rootPath =" E:\",但在Ubuntu rootPath =" / media / ubuntu"中不起作用,这是我的奇怪点仍然不明白的是,如果我在文件管理器中打开pendrive 线程工作正常,但我需要它在pendrive插入usb端口时工作,而不是当用户浏览时文件管理器的文件。我该怎么办?

1 个答案:

答案 0 :(得分:0)

在Linux机器上,我可以想到两个命令,它们为您提供有关插入哪些设备的有用信息。第一个是lsusb。当我在我的机器上运行时:

Bus 002 Device 003: ID 8086:0189 Intel Corp. 
Bus 002 Device 021: ID 0718:061a Imation Corp. 
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
...

第二行是我的笔式驱动器。 另一个命令是dmesg

[148541.700254] sd 8:0:0:0: [sdb] Attached SCSI removable disk
[148830.993250] usb 2-1.2: USB disconnect, device number 21
[148836.316642] usb 2-1.2: new high-speed USB device number 22 using ehci-pci
[148836.415145] usb 2-1.2: New USB device found, idVendor=..., idProduct=....
[148836.415157] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[148836.415162] usb 2-1.2: Product: iPhone
[148836.415167] usb 2-1.2: Manufacturer: Apple Inc.
[148836.415171] usb 2-1.2: SerialNumber: ....
[148836.894819] ipheth 2-1.2:4.2: Apple iPhone USB Ethernet device attached

您可以将程序设置为轮询其中任何一个命令并解析输出,即使用Runtime.getRuntime().exec("dmesg)"

我认为这个解决方案是一种解决方案,我想有很多其他可能的方法来检测何时连接USB驱动器。