gpt4 book ai didi

java - 运行 Java 进程时生成空输出文件

转载 作者:行者123 更新时间:2023-11-30 09:18:56 25 4
gpt4 key购买 nike

我的代码的某个部分有一些问题。应该发生的是 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);
}

最佳答案

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

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

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

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

也就是说,我个人会直接使用 Java native 完成所有这些操作,而不是依赖外部的、特定于平台的依赖项。

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

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

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);
}

或者只是将 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);

关于java - 运行 Java 进程时生成空输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18239212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com