运行Java Process时会生成空输出文件

时间:2013-08-14 18:12:57

标签: java unix

我的某段代码遇到了一些问题。应该发生的是Java程序需要一些预定的变量并使用UNIX" sed"功能取代弦乐" AAA"和" BBB"在预先编写的shell脚本中。我有三种方法可以做到这一点:使用" sed"替换文件中的字符串。并将输出写入另一个文件;一个用" rm"删除原始文件的文件命令;并使用" mv"将输出文件重命名为原始文件的名称。在三个不同的目录中有三个shell脚本副本,每个目录应该用它自己的特定变量替换。

所有三个shell脚本文件都应该进行替换,但只会发生两次。在第三个shell脚本上,似乎进程没有完成,因为该文件的字节大小为0.未替换的文件是完全随机的,因此它们不是同一个文件在每个文件中都不起作用跑。

我不确定为什么会出现这种错误。有人有任何可能的解决方案吗?这是代码:

    public void modifyShellScript(String firstParam, String secondParam, int thirdParam, int fourthParam, String outfileDirectoryPath) throws IOException{
    String thirdDammifParamString = "";
    String fourthDammifParamString = "";
    thirdDammifParamString = Integer.toString(thirdDammifParam);
    fourthDammifParamString = Integer.toString(fourthDammifParam);
    String[] cmdArray3 = {"/bin/tcsh","-c", "sed -e 's/AAA/"+firstDammifParam+"/' -e 's/BBB/"+secondDammifParam+"/' -e 's/C/"+thirdDammifParamString+"/' -e 's/D/"+fourthDammifParam+"/' "+outfileDirectoryPath+"runDammifScript.sh > "+outfileDirectoryPath+"runDammifScript.sh2"};
    Process p;
    p = Runtime.getRuntime().exec(cmdArray3);
}

public void removeOriginalShellScript(String outfileDirectoryPath) throws IOException{
    String[] removeCmdArray = {"/bin/tcsh", "-c", "rm "+outfileDirectoryPath+"runDammifScript.sh"};
    Process p1;
    p1 = Runtime.getRuntime().exec(removeCmdArray);
}

public void reconvertOutputScript(String outfileDirectoryPath) throws IOException{
    String[] reconvertCmdArray = {"/bin/tcsh","-c","mv "+outfileDirectoryPath+"runDammifScript.sh2 "+outfileDirectoryPath+"runDammifScript.sh"};
    Process reconvert; 
    reconvert = Runtime.getRuntime().exec(reconvertCmdArray);
}

1 个答案:

答案 0 :(得分:2)

如果您还没有,请查看When Runtime.exec() won't。一个或多个Process可能会挂起,因为您没有消耗输出和错误流。特别是,请查看该文章示例中的StreamGobbler

也可能是您忘记在outfileDirectoryPath中包含尾部斜杠。阅读Process'错误流,看看出了什么问题:

InputStream err = p.getErrorStream();
// read the stream and print its contents to the console, or whatever

请记住,您需要在单独的线程中阅读流。

也就是说,我个人只是在Java中本地完成所有这些操作,而不是依赖于外部的,特定于平台的依赖项。

对于子字符串替换read the file to a String,然后使用String.replace和/或String.replaceAll

您可以通过调用removeOriginalShellScript来替换File.delete的正文:

public void removeOriginalShellScript(String outfileDirectoryPath) throws IOException{
    File f = new File(outfileDirectoryPath, "runDammifScript.sh");
    f.delete();
}

您可以通过调用reconvertOutputScript来替换Files.move的正文:

public void reconvertOutputScript(String outfileDirectoryPath) throws IOException{
    File src = new File(outfileDirectoryPath, "runDammifScript.sh2");
    File dst = new File(outfileDirectoryPath, "runDammifScript.sh");
    Files.move(src, dst);
}

或者只需通过调用Files.move替换removeOriginalShellScript和reconvertOoutputScript,并指定REPLACE_EXISTING选项:

File src = new File(outfileDirectoryPath, "runDammifScript.sh2");
File dst = new File(outfileDirectoryPath, "runDammifScript.sh");
Files.move(src, dst, REPLACE_EXISTING);