`

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

 
阅读更多

转:http://blog.csdn.net/canedy/article/details/6005153

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

新建一个类StreamGobble类:

package thss.jmencoder; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
public class StreamGobble extends Thread { 
    InputStream is; 
    String type; 

    StreamGobble(InputStream is, String type) { 
        this.is = is; 
        this.type = type; 
    } 

    public void run() { 
        try { 
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr); 
            String line = null; 
            while ((line = br.readLine()) != null) 
                System.out.println(type + ">" + line); 
        } catch (IOException ioe) { 
            ioe.printStackTrace(); 
        } 
    } 
} 


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

String line = value.toString(); 
String[] str = line.split(" "); 
String fOutput = null; 
fOutput = str[3] + ".flv"; 
Process process = null; 
try { 
    Runtime runtime = Runtime.getRuntime(); 
    process = runtime .exec("mencoder -ofps 30000/1001 -vf harddup" 
        + " /user/student/data/"+str[0] 
        + " -ss "+str[1]+" -endpos "+str[2]+" -sws 2 -of lavf -ovc lavc -lavcopts " 
        + "vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 " 
        + "-nosound -srate 22050 -o /user/student/data/"+fOutput); 
    new StreamGobble(process.getInputStream(), "INFO").start(); 
    new StreamGobble(process.getErrorStream(), "ERROR").start(); 
    int status = process.waitFor(); 
    System.out.println("Process exitValue: " + status); 
    } catch (Throwable t) { 
        t.getStackTrace(); 
    } finally { 
        if (process == null) 
            process.destroy(); 
        process = null; 
    }
 

 

分享到:
评论

相关推荐

    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调用本地的远程桌面连接

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

    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调用系统执行程序(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