`

java Runtime Process调用可执行文件,子进程阻塞

阅读更多

今天调用mencoder时遇到 Cannot run program " mencoder": CreateProcess error=2, ?????????  查了查,这个可以解决,就拿过来了

我用java调用mencoder实施转码,但是转码过程中出现子进程阻塞,而且还是看了API才知道这个问题的。因为mencoder 的控制台输出信息很多,把缓存区所有的空间占满了,所以程序不能执行后面的程序,mencoder就只能转码28秒的视频,所以需要建立线程及时清空缓存 区。

新建一个类StreamGobble类:

  1. package  thss.jmencoder;   
  2. import  java.io.BufferedReader;   
  3. import  java.io.IOException;   
  4. import  java.io.InputStream;   
  5. import  java.io.InputStreamReader;   
  6. public   class  StreamGobble  extends  Thread {   
  7.     InputStream is;   
  8.     String type;   
  9.   
  10.     StreamGobble(InputStream is, String type) {   
  11.         this .is = is;   
  12.         this .type = type;   
  13.     }   
  14.   
  15.     public   void  run() {   
  16.         try  {   
  17.             InputStreamReader isr = new  InputStreamReader(is);  
  18.             BufferedReader br = new  BufferedReader(isr);   
  19.             String line = null ;   
  20.             while  ((line = br.readLine()) !=  null )   
  21.                 System.out.println(type + ">"  + line);   
  22.         } catch  (IOException ioe) {   
  23.             ioe.printStackTrace();   
  24.         }   
  25.     }   
  26. }   

在main函数中调用Runtime/Process执行转码

  1. String line = value.toString();   
  2. String[] str = line.split(" " );   
  3. String fOutput = null ;   
  4. fOutput = str[3 ] +  ".flv" ;   
  5. Process process = null ;   
  6. try  {   
  7.     Runtime runtime = Runtime.getRuntime();   
  8.     process = runtime .exec("mencoder -ofps 30000/1001 -vf harddup"    
  9.         + " /user/student/data/" +str[ 0 ]   
  10.         + " -ss " +str[ 1 ]+ " -endpos " +str[ 2 ]+ " -sws 2 -of lavf -ovc lavc -lavcopts "    
  11.         + "vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 "    
  12.         + "-nosound -srate 22050 -o /user/student/data/" +fOutput);   
  13.     new  StreamGobble(process.getInputStream(),  "INFO" ).start();   
  14.     new  StreamGobble(process.getErrorStream(),  "ERROR" ).start();   
  15.     int  status = process.waitFor();   
  16.     System.out.println("Process exitValue: "  + status);   
  17.     } catch  (Throwable t) {   
  18.         t.getStackTrace();   
  19.     } finally  {   
  20.         if  (process ==  null )   
  21.             process.destroy();   
  22.         process = null ;   
  23.     } 
分享到:
评论

相关推荐

    java调用exe可执行文件

    在Java编程中,有时我们需要与操作系统进行交互,例如调用已存在的Windows系统下的.exe可执行文件。这在处理一些特定的任务,如自动化脚本、数据分析或者其他需要借助外部工具完成的功能时非常常见。本文将深入探讨...

    java调用windows命令

    在Java编程中,有时我们需要在程序中调用Windows系统的命令行操作,例如执行外部程序、系统命令或者进行文件操作。Java提供了Runtime类和Process类来实现这一功能。以下是如何使用Java调用Windows命令行的详细步骤和...

    java 调用windows的一些可执行文件

    在Java编程环境中,有时我们需要与操作系统进行交互,例如调用Windows系统的可执行文件或批处理文件来执行特定任务。这通常通过Java的Runtime类或ProcessBuilder类实现。这两个类允许我们构建命令行指令并执行它们,...

    java中调用本地exe文件

    这个方法会阻塞当前线程直到子进程结束为止。这样可以确保我们在继续执行后续代码之前,等待记事本程序完全关闭。 #### 2.3 `p.exitValue()`方法 获取子进程的退出状态码。通常情况下,如果程序正常结束,则返回值...

    java执行可执行文件或批处理

    在Java中执行外部可执行文件或批处理脚本是一种常见的需求,尤其是在需要调用系统级别的工具或者与操作系统进行交互时。通过Java的`Runtime`类及其提供的方法,我们可以方便地实现这一功能。本文将详细介绍如何在...

    JAVA调用OS命令删除文件

    在Java编程中,有时我们可能需要执行操作系统级别的命令,例如删除文件。这通常是通过Java的`Runtime`类或`ProcessBuilder`类来实现的。这两个类提供了与操作系统交互的能力,让我们能够执行系统命令并获取其结果。...

    Java调用Linux命令

    通过以上介绍,我们不仅了解了如何在Java程序中调用Linux命令的基本原理,还学习了如何通过`Runtime.exec()`方法创建子进程以及如何控制这些子进程。这对于开发需要与操作系统交互的应用程序是非常有用的。

    java中调用控制台程序

    以上就是关于"java中调用控制台程序"的基本概念和实践方法,包括使用Runtime和ProcessBuilder执行系统命令,以及如何调用wget工具。在实际应用中,可能还需要根据具体需求进行错误处理、进程通信等更复杂的操作。...

    Java调用Linux CenterOS系统安装的OpenOffice4报错

    1. **路径问题**:确保Java代码中指定的OpenOffice可执行文件路径是正确的,且Java程序具有访问该路径的权限。 2. **环境变量**:OpenOffice可能依赖于某些环境变量,如`LD_LIBRARY_PATH`,确保它们被正确设置。 3. ...

    JAVA如何调用DOS命令

    Runtime 类提供了 exec() 方法,用于指示 Java 虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的 Process 对象实例。Process 对象可以控制该子进程的执行或获取该子进程的信息。 执行DOS内部命令...

    JAVA如何调用DOS命令.doc

    在Java编程中,有时我们需要在程序中调用操作系统的一些功能,比如执行DOS命令,这通常是通过Java的`Runtime`类和`Process`类来实现的。本文将详细讲解如何在Java中调用DOS命令以及相关的注意事项。 首先,调用DOS...

    JAVA执行可执行文件

    在Java编程环境中,有时我们需要执行操作系统级别的命令或者运行非Java的可执行文件,例如Windows下的.exe文件。这个过程可以通过Java的Runtime类或者ProcessBuilder类来实现。本文将深入探讨如何在Java中执行可执行...

    JAVA如何调用WINDOWS命令行.doc

    `Runtime.getRuntime()`返回当前应用程序的`Runtime`对象,该对象的`exec()`方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的`Process`对象实例。`process.waitFor()`则是等待子进程...

    Runtime 执行bat

    当我们需要在Java程序中执行系统命令,比如运行一个批处理脚本(.bat文件)时,`Runtime`类或者其扩展类`ProcessBuilder`就派上了用场。下面我们将深入探讨如何使用`Runtime`执行bat脚本,并了解相关知识点。 1. **...

    Java调用Windows批处理.docx

    可以使用`Process`对象的`waitFor()`方法来实现这一点,它会阻塞当前线程,直到子进程终止。 6. **关闭流资源**:在完成批处理文件的输出读取后,别忘了关闭`BufferedReader`和`InputStreamReader`,以释放系统资源...

    Java调用本地的远程桌面连接

    这个方法允许我们在Java程序中执行任何可执行文件或命令行脚本。例如,我们可以构造一个包含用户名、密码和目标计算机地址的RDP连接字符串,然后用`mstsc.exe`命令行参数来启动远程桌面连接。 以下是一个简单的示例...

    Java调用系统执行程序(OS Command)

    这个过程通常被称为调用系统执行程序,或称为进程控制。在Java中,我们可以使用`Runtime`类或者`ProcessBuilder`类来实现这个功能。下面将详细解释如何通过Java调用系统执行程序,以标题和描述中的例子作为基础进行...

    java工程 实现调用系统命令ping

    在Java中,我们可以使用`Runtime.getRuntime().exec()`方法或者`ProcessBuilder`类来执行系统命令。下面我们将详细介绍如何使用这两种方法实现“ping”命令。 ### 使用`Runtime.getRuntime().exec()`方法 1. **...

    java代码中调用linux/unix命令

    在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如文件操作、进程管理等。在Linux和Unix环境中,这些任务通常可以通过执行Shell命令来实现。本文将详细介绍如何在Java代码中调用Linux/...

    Java调用命令行!

    在Java编程中,调用命令行是常见的任务之一,它允许开发者执行系统级别的操作,如运行外部程序、管理系统资源或进行文件操作。本篇将详细讲解如何在Java中调用命令行,以及相关的知识点。 首先,Java通过`Runtime`...

Global site tag (gtag.js) - Google Analytics