【发布时间】:2014-12-02 14:24:33
【问题描述】:
我正在寻找一个允许注册文件系统挂载事件的 Java API,即当文件系统被挂载或卸载时。具体来说,我想知道可移动 USB 设备上的文件系统何时可用,并且还确切知道它是什么类型的 USB 设备。
默认情况下,udev 子系统会提供有关 USB 插拔事件的通知,但不会专门在设备上的文件系统可用时提供通知。可以创建可以分段执行此操作的 udev 规则,例如添加和删除设备时创建目录并执行程序。但是我对 udev 规则的经验是语法晦涩难懂,而且它们很脆弱,调试起来也不简单。
我已经按照这篇文章安装了 usbmount:
https://serverfault.com/questions/414120/how-to-get-usb-devices-to-automount-in-ubuntu-12-04-server
虽然我相信这些设备默认是自动安装的。
作为替代方案,我在 /media 上构建了一个 JDK 7 WatcherService,它可以检测 /etc/mtab 中的变化。这可行,但我看到某些 USB 设备上的文件系统仍未准备好的情况——这意味着尝试读取目录会引发异常——即使在 /etc/mtab 中的条目完成后也是如此。我添加了一个定时器来休眠可配置的毫秒数,在大多数情况下,100 毫秒的等待时间有效,但不是 100% 的时间。这意味着增加这个等待时间不是绝对的保证,也不是确定的。
很明显,由于显示了 Nautilus 弹出窗口,因此正在生成挂载事件。我有一个闪存驱动器的案例,它可以将 Nautilus 图标放在启动板菜单中,但在单击打开图标之前它不会安装。
我也看过这些选项:
- 拖尾 /var/log/syslog;这可能是下一个最佳选择。我看到如下行:
:Dec 2 08:58:07 fred-Inspiron-530 udisksd[1759]: 代表 uid 1000 在 /media/fred/USB DISK1 挂载 /dev/sdk1
我将在此处尝试 WatcherService 以查看是否存在相同的计时问题,即一旦写入此消息,目录是否可读。
jlibudev [ github.com/nigelb/jlibudev ] udev 子系统的 Java API 比编写规则要好得多,但它仍然存在不足之处,因为您仍然必须将许多不同的事件拼凑在一起。注意:jlibudev 依赖于 JNA [https://github.com/twall/jna] 和 purejavacomm [github.com/nyholku/purejavacomm,sparetimelabs.com/purejavacomm/purejavacomm.php],它们本身就非常有用。
lsusb 提供有关 USB 设备的详细信息,但不提供有关其安装位置的信息。
理想情况下,我想要一个简单的 API,允许使用标准 Java 事件侦听模式注册文件系统挂载/卸载事件。鉴于在宏观层面上正在发生净效应,我想相信这样的 API 存在或至少是可能的。我仍在寻找其他选项的 JDK 7 和 JDK 8 API。
我们将不胜感激任何和所有的指点和帮助。
【问题讨论】:
标签: java notifications filesystems