我正在尝试编写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.IOException:无法运行程序“wget”:error = 2,没有这样的文件 或目录
如果有人能告诉我自己做错了什么,我将不胜感激。
答案 0 :(得分:3)
如果您的OS X系统上确实安装了wget
,请尝试指定它的完整路径。
尝试:
从命令行哪个wget
,然后在Java应用程序中使用该完全限定的路径。
String whatToRun = "/usr/local/bin/wget http://insitu.fruitfly.org/insitu_image_storage/img_dir_38/insitu38795.jpe";
答案 1 :(得分:2)
很明显,OS X中默认不安装wget
。
更有趣的是编写像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();
答案 2 :(得分:2)
这些答案都不能解释您的实际问题。
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都将最终继承该PATH 。但是在Mac上,你所有的GUI都是launchd的孩子,你运行的任何shell都只是你的GUI应用程序的兄弟,而不是父。因此,在bash的启动中设置PATH不会影响从Finder或IDE或其他任何东西启动的内容。
一旦你理解了这个问题,你就可以理解所有不同的解决方案 - 你可以set the default environment launchd gives to user processes,或者在系统范围内做同样的事情,或者修改/ etc / paths等。
答案 3 :(得分:0)
看起来该OSX系统上没有安装wget
。 (它不在我的身上,尽管它已经老了几代。)要么安装它,要么找另一种下载图片的方式; Java确实本身就内置了HTTP支持(参见java.net.URL
类)。
答案 4 :(得分:0)
如果再次出现此错误,请执行以下命令:
哪个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" })