2

我的代码的某个部分有一些问题。应该发生的是,Java 程序采用一些预先确定的变量并使用 UNIX 的“sed”函数来替换预先编写的 shell 脚本中的字符串“AAA”和“BBB”。我有三种方法可以做到这一点:一种使用“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);
}
4

1 回答 1

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 中完成所有这些工作,而不是依赖于外部的、特定于平台的依赖项。

对于子字符串替换,将文件读入 String,然后使用String.replaceand/or String.replaceAll

您可以将removeOriginalShellScript's body 替换为调用File.delete

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

您可以将reconvertOutputScript's body 替换为调用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);
}

或者只是将 removeOriginalShellScript 和 reconvertOoutputScript 替换为调用Files.move,指定REPLACE_EXISTING选项:

File src = new File(outfileDirectoryPath, "runDammifScript.sh2");
File dst = new File(outfileDirectoryPath, "runDammifScript.sh");
Files.move(src, dst, REPLACE_EXISTING);
于 2013-08-14T18:33:52.010 回答