使用Java(OSX)在终端中调用命令

我正在尝试编写Java代码来运行wget以从服务器检索图像

我相信我已经正确安装了。 如果我输入:

wget http://sofzh.miximages.com/java/insitu38795.jpg 

我在用户帐户文件夹中找到了该图像。

以下Java代码在Ubuntu上正常运行,但我不得不将项目移至OSX(Mountain Lion)

 import java.io.*; import java.io.IOException; public class runWget { public static void main (String args[]) { String whatToRun = "wget http://sofzh.miximages.com/java/insitu38795.jpg"; try { Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(whatToRun); int exitVal = proc.waitFor(); System.out.println("Process exitValue:" + exitVal); } catch (Throwable t) { t.printStackTrace(); } } } 

当我尝试在OSX上运行它时,我收到运行时错误:

java.io.IOException:无法运行程序“wget”:error = 2,没有这样的文件或目录

如果有人能告诉我我做错了什么,我将不胜感激。

如果确实在OS X系统上安装了wget ,则尝试指定它的完整路径。

尝试:

哪个wget

从命令行,然后在Java应用程序中使用该完全限定的路径。

 String whatToRun = "/usr/local/bin/wget http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe"; 

很明显,OS X中默认不安装wget

更有趣的是编写像你自己的wget这样的function。

 URL url = new URL("http://sofzh.miximages.com/java/insitu38795.jpg"); InputStream in = url.openStream(); OutputStream os = new FileOutputStream(new File("picture.jpe")); byte byffer[] = new byte[1024]; int nBytesRead; while ((nBytesRead = in.read(buffer)) != -1) { os.write(buffer, 0, nBytesRead); } os.flush(); os.close(); in.close(); 

这些答案都没有解释您的实际问题。

Java失败的原因是/ usr / local / bin不在您的PATH上。

显然它是在你在终端中运行的bash shell的路径上。 可能你在终端(或通过ssh,或其他)开始的任何新的bash shell。 这可能是因为你在〜/ .profile,〜/ .bash_profile,〜/ .bashrc或/ etc等价物中有一行像export PATH=$PATH:/usr/local/bin

在linux上,你所有的GUI东西都是登录shell的子代,所以把东西放在其中一个文件中(只要你选择正确的文件)意味着无论它如何启动,Java都将最终inheritance该PATH。 但是在Mac上,你所有的GUI都是launchd的孩子,你运行的任何shell都只是你的GUI应用程序的兄弟,而不是父。 因此,在bash的启动中设置PATH不会影响从Finder或IDE或其他任何东西启动的内容。

一旦理解了问题,就可以理解所有不同的解决方案 – 您可以设置launchd为用户进程提供的默认环境 ,或者在系统范围内执行相同的操作,或者修改/ etc / paths等。

看起来好像没有在该OSX系统上安装wget 。 (它不在我的身上,尽管它已经老了几代了。)要么安装它,要么找另一种下载图片的方式; Java本身就具有内置的HTTP支持(参见java.net.URL类)。

如果再次出现此错误,请执行以下命令:

哪个wget

 Runtime.getRuntime().exec(new String[]{ "/bin/sh" , "-c" ,"/usr/local/bin/wget http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe" })