最近在java程序中调用音视频转码工具ffmpeg.exe,在使用Process进行子进程的调用过程总会如下报错,将解决问题的方法记录一下
Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
at java.lang.ProcessImpl.start(ProcessImpl.java:137)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 1 more
- Process的使用
Runtime.getRuntime().exec("ping www.baidu.com");//最终使用的也是ProcessBuilder
new ProcessBuilder(Arrays.asList("ping","www.baidu.com")).start();
- 具体报错细节
创建C:\Users\paul\Desktop\cmd\test.bat,内容如下
echo C:\Users\paul\Desktop\cmd
创建C:\Users\paul\Desktop\java\TestProcess.java,内容如下
import org.apache.commons.io.Charsets;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* Created by paul on 2018/12/8.
*/
public class TestProcess {
public static void main(String[] args) throws Exception {
System.out.println("当前进程的工作空间:" + System.getProperty("user.dir"));
Process process = new ProcessBuilder("test.bat")
.directory(new File("C:\\Users\\paul\\Desktop\\cmd"))//TODO @1
.start();
InputStream errorStream = process.getErrorStream();
InputStream inputStream = process.getInputStream();
print(errorStream);
print(inputStream);
process.waitFor();
}
public static void print(InputStream input){
try {
String encoding = System.getProperty("sun.jnu.encoding");
InputStreamReader reader = new InputStreamReader(input, encoding);
BufferedReader bufferedReader= new BufferedReader(reader);
for(String line = bufferedReader.readLine(); line != null; line = bufferedReader.readLine()) {
System.out.println(line);
}
}catch (Exception e){
}
}
}
执行java TestProcess结果:
当前进程的工作空间:C:\Users\paul\Desktop\java
Exception in thread "main" java.io.IOException: Cannot run program "test.bat" (i
n directory "C:\Users\paul\Desktop\cmd"): CreateProcess error=2, 系统找不到指定
的文件。
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at TestProcess.main(TestProcess.java:16)
Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
at java.lang.ProcessImpl.start(ProcessImpl.java:137)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 1 more
为什么发生这问题了,我工作目录C:\Users\paul\Desktop\cmd有test.bat的脚本但是报错系统找不到文件了
- 在C:\Users\paul\Desktop\java\test.bat,或者系统变量path路径创建test.bat,内容如下
echo hello world
执行java TestProcess结果
当前进程的工作空间:C:\Users\paul\Desktop\java
C:\Users\paul\Desktop\cmd>echo C:\Users\paul\Desktop\cmd
C:\Users\paul\Desktop\cmd
4.仅保留C:\Users\paul\Desktop\java\test.bat执行java TestProcess 报一下面错误。
当前进程的工作空间:C:\Users\paul\Desktop\java
'test.bat' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
- 仅保留C:\Users\paul\Desktop\java\test.bat 将TestProcess //TODO @1这一行注释,执行结果
当前进程的工作空间:C:\Users\paul\Desktop\java
C:\Users\paul\Desktop\java>echo hello world
hello world
总结如下:是否报错[系统找不到指定的文件],取决于运行java TestProcess进程的工作空间或者系统PATH是否存在command(test.bat),至于子进程中执行command(test.bat),首先判断子进程是否设置工作空间,如果没有设置,将父进程作为自己的工作空间,接着子进程执行命令,若工作空间找到,则执行,若工作空间没找到,从环境变量Path路径查找执行,还没有找到报错['test.bat' 不是内部或外部命令,也不是可运行的程序]
注意:
- 子进程的输出流可能出现乱码注意是使用System.getProperty("file.encoding")和System.getProperty("sun.jnu.encoding")的区别
-waitFor()使用前需将errorStream,inputStream 缓冲区的数据取否,否则会发生死等,可以使用异步或者线程池
网友评论