Runtime.exec没有运行“find”命令

时间:2011-08-15 07:33:55

标签: java unix

我的问题是,我使用Runtime.getruntime.exec()函数在Java上运行我的unix命令。但是,当正在运行exec()命令时,它会跳转到代码的末尾。代码如下。

    Process songProcess;
    ArrayList<String> xmlFilePathsForEmi = new ArrayList<String>();
    int countForEmiSongUpdates = 0;
    String line;
    try {
        songProcess = Runtime.getRuntime().exec(new String[]{"find /home/gozenem/emiornek/ -name '*.xml'"}); // It jumps here !
        songProcess.waitFor();
        bufferedReaderSong = new BufferedReader(new InputStreamReader(songProcess.getInputStream()));
        while((line = bufferedReaderSong.readLine()) != null){
            xmlFilePathsForEmi.add(line);
        }

...
...
...
}

我不知道它与什么有关,可能是有一个exec函数无法运行的字符。我需要你宝贵的帮助。谢谢。

1 个答案:

答案 0 :(得分:3)

String[] Runtime.exec()参数不正确。它必须被拆分,以便每个项目包含一个元素(可执行文件必须是一个字符串,然后每个单独的参数必须有自己的字符串)。

尝试类似:

songProcess = Runtime.getRuntime().exec(new String[]{"find", "/home/gozenem/emiornek/", "-name", "*.xml"});

同样调用waitFor你正在做的事情是不合适的。您需要在进程运行时读取输出,否则可能会填满Java VM和进程之间使用的I / O缓冲区。因此,在处理完输出后,请将waitFor移到。

来自Process文档:

  

默认情况下,创建的子进程没有自己的终端或控制台。其所有标准I / O(即stdin,stdout,stderr)操作将被重定向到父进程,[...]。由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞,甚至死锁。 / p>