美文网首页
解决java调用ProcessBuilder报错系统找不到指定的

解决java调用ProcessBuilder报错系统找不到指定的

作者: 全都是泡沫啦 | 来源:发表于2018-12-08 22:29 被阅读0次

    最近在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
    
    1. Process的使用
    Runtime.getRuntime().exec("ping www.baidu.com");//最终使用的也是ProcessBuilder
    new ProcessBuilder(Arrays.asList("ping","www.baidu.com")).start();
    
    1. 具体报错细节
      创建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的脚本但是报错系统找不到文件了

    1. 在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' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    
    1. 仅保留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 缓冲区的数据取否,否则会发生死等,可以使用异步或者线程池

    相关文章

      网友评论

          本文标题:解决java调用ProcessBuilder报错系统找不到指定的

          本文链接:https://www.haomeiwen.com/subject/bvjchqtx.html