Java程序中的Mac Eject USB Disk

时间:2011-09-09 15:37:16

标签: java macos command-line

我正在尝试从Java程序中弹出Mac上的USB拇指驱动器。我试过umount和diskutil弹出,但都不起作用。我从两者得到退出代码1。如果我物理地拔出驱动器,Mac OS X会给我标准警告。

我的代码:

log.debug( "going to eject targetRoot.getPath()=" + targetRoot.getPath() );
String command = "diskutil eject " + targetRoot.getPath().replace( " ", "\\ " );
log.debug( "about to run command=" + command );
int exitCode = Runtime.getRuntime().exec( command ).waitFor();
log.debug( "exitCode=" + exitCode );

输出:

going to eject targetRoot.getPath()=/Volumes/NO NAME
about to run command=diskutil eject /Volumes/NO\ NAME
exitCode=1

手册页表明您可以使用已安装的路径或设备的路径作为umount或diskutil弹出的参数。

如果我将命令复制到终端并运行它,那么它可以正常工作。我怀疑这是与环境有关的东西,但是你可以看到我没有向exec方法发送envp。

程序员必须做什么才能使弹出/卸载工作?

谢谢!

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用ProcessBuilder而不是Runtime.exec()?它允许您精确地指定每个参数,并且还允许您构建环境。

...或至少使用Runtime.exec()的形式指定参数数组而不是字符串。

我猜你的空间转义不起作用 - Runtime.exec()的便利形式使用StringTokenizer处理空格,可能不像大多数shell那样聪明。