代码之家  ›  专栏  ›  技术社区  ›  Joseph

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

  •  0
  • Joseph  · 技术社区  · 12 年前

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

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

    wget http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe
    

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

    以下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://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe";
       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.io异常:无法运行程序“wget”:错误=2,没有这样的文件 或目录

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

    5 回复  |  直到 12 年前
        1
  •  3
  •   David Kroukamp    12 年前

    如果 wget 确实安装在您的OS X系统上,然后尝试指定其完整路径。

    尝试:

    哪个wget

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

    String whatToRun = "/usr/local/bin/wget http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe";
    
        2
  •  3
  •   Martijn Courteaux    12 年前

    很明显, wget 默认情况下未在OS X中安装。

    更有趣的是编写像wget这样的功能。

    URL url = new URL("http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe");
    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();
    
        3
  •  2
  •   abarnert    12 年前

    这些答案都不能解释你的实际问题是什么。

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

    很明显,它位于您在终端中运行的bash shell的路径上。可能还有您在终端中启动的任何新bash shell(或通过ssh或其他方式)。这可能是因为你有一句台词 export PATH=$PATH:/usr/local/bin 在~/.profile、~/.bash_profile、~+/.bashrc或/etc/etc等效文件中的某个位置。

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

    一旦你理解了这个问题,你就可以理解所有不同的解决方案 set the default environment launchd gives to user processes ,或者在系统范围内做同样的事情,或者修改/etc/path等。

        4
  •  0
  •   Donal Fellows    12 年前

    它看起来像 wget 未安装在该OSX系统上。(它也不在我的电脑上,尽管它比我老了几代人。)要么安装它,要么找另一种方式下载图片;毕竟,Java本身就内置了HTTP支持(请参阅 java.net.URL 类)。

        5
  •  0
  •   Steve Jiang    7 年前

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

    哪个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" })