我的某段代码遇到了一些问题。应该发生的是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);
}
答案 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);