标题并不能真正解释我的问题,但是我不知道如何更好地提出问题。因此,基本上,我正在编写一个使用程序livestreamer的应用程序。我使用easy_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 = new String[]{"livestreamer", "twitch.tv/"+channel, quality};
替换为例如ls
,则输出不会有任何问题。这是我第一次弄这种东西,所以我的错误可能是一个真正的新手。在此先感谢您提供的所有帮助! 最佳答案
livestreamer
不在Java进程的路径中。
每个Windows和Unix操作系统的执行环境都有一个程序路径的概念。该路径是一个环境变量(在除Windows(使用PATH
的Windows之外)的所有操作系统中均命名为Path
)。它包含目录列表,用冒号:
分隔,但Windows上用分号(;
)分隔的目录除外。
与任何环境变量一样,每个正在运行的进程都可以定义自己的路径,子进程通常从其父进程继承它。
每当您尝试运行没有任何目录分隔符的程序时(例如,尝试运行ls
而不是/bin/ls
),系统都会在路径中的每个目录中查找该程序。
在终端中,PATH包含一个目录,其中包含livestream
。运行Java进程时,您具有不同的PATH,该PATH不包含包含livestream
的目录。
最简单的解决方案是通过其绝对文件名引用livestream
,从而使系统执行路径无关紧要:
String[] cmd = { "/usr/bin/livestreamer", "twitch.tv/" + channel, quality };
/usr/bin/livestreamer
只是一个例子。我不知道livestreamer实际上安装在您的系统上。要找到它,请在终端中执行
which livestreamer
。那应该告诉您它的绝对位置。 (我认为在Windows中,命令为where livestreamer
。)