使用ProcessBuilder/RunTime从java调用easy_安装应用程序

使用ProcessBuilder/RunTime从java调用easy_安装应用程序,java,macos,Java,Macos,标题并不能真正解释我的问题,但我不知道如何更好地提问。因此,基本上,我正在编写一个使用livestreamer程序的应用程序。我使用:easy\U install-U livestreamer在mac上安装了它。到目前为止,很好,当我在终端上编写livestream时,它就可以工作了。现在,我的问题是,当我尝试在java上调用它时: public static void runLiveStreamer(String channel, String quality) throws IOEx

标题并不能真正解释我的问题,但我不知道如何更好地提问。因此,基本上,我正在编写一个使用livestreamer程序的应用程序。我使用:
easy\U install-U livestreamer
在mac上安装了它。到目前为止,很好,当我在终端上编写
livestream
时,它就可以工作了。现在,我的问题是,当我尝试在java上调用它时:

    public static void runLiveStreamer(String channel, String quality) throws IOException{


    String[] cmd  = new String[]{"livestreamer", "twitch.tv/"+channel, quality};
    Process proc = Runtime.getRuntime().exec(cmd);
    InputStreamReader isr = new InputStreamReader(proc.getInputStream());
    BufferedReader br = new BufferedReader(isr);
    String line=null;
    while ( (line = br.readLine()) != null)
        System.out.println(line);    
}
我得到这个错误:

Exception in thread "main" java.io.IOException: Cannot run program "livestreamer": error=2, No such file or directory
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
at java.base/java.lang.Runtime.exec(Runtime.java:591)
at java.base/java.lang.Runtime.exec(Runtime.java:450)
at livestream.runLiveStreamer(livestream.java:12)

我知道代码是有效的,因为如果我替换
String[]cmd=newstring[]{“livestreamer”,“twitch.tv/”+channel,quality}
使用,例如,
ls
,它输出时没有任何问题。这是我第一次处理这类事情,所以我的错误可能是一个真正的新手。提前感谢所有的帮助

livestreamer
不在Java进程的路径中

每个Windows和Unix操作系统的执行环境都有一个程序路径的概念。path是一个环境变量(在除Windows以外的所有操作系统中都名为
path
,Windows使用
path
)。它包含一个目录列表,以冒号分隔(
):
,但在Windows上以分号分隔的目录除外(

与任何环境变量一样,每个正在运行的进程都可以定义自己的路径,子进程通常从其父进程继承路径

每当您尝试运行没有任何目录分隔符的程序时(例如,尝试运行
ls
而不是
/bin/ls
),系统将在路径中的每个目录中查找该程序

在终端中,您的路径包含一个目录,其中包含
livestream
。当您运行Java进程时,您有一个不同的路径,该路径不包括包含
livestream
的目录

最简单的解决方案是通过绝对文件名引用
livestream
,从而使系统执行路径不相关:

String[] cmd  = { "/usr/bin/livestreamer", "twitch.tv/" + channel, quality };
/usr/bin/livestreamer
只是一个例子。我不知道livestreamer在您的系统上实际安装的位置


要找到它,请在您的终端中执行
哪个livestreamer
。这应该告诉你它的绝对位置。(我想在Windows中,命令应该是
where livestreamer

我想了想,但我不知道运行时使用java路径,嗯,现在有意义了,它正在工作!谢谢