gpt4 book ai didi

java - 从 java 程序执行 cat 命令不能按预期工作

转载 作者:行者123 更新时间:2023-12-04 16:16:38 27 4
gpt4 key购买 nike

我正在尝试使用 java 程序中的 cat 命令将两个文件合并为一个文件。包含 cat 命令的代码行获取两个文件 file1 和 file2,并写入第三个名为 combinedfile 的文件。然而,我观察到的是我的程序没有创建这个文件 (combinedfile) 并写入它,而是只在终端上显示输出。

我怎样才能确保确实将这两个文件复制到第三个文件。

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ExecuteShellCommand
{

public static void main(String[] args)
{

ExecuteShellCommand obj = new ExecuteShellCommand();

String command = "cat file1 file2 > combinedfile";

String output = obj.executeCommand(command);

System.out.println(output);

}

private String executeCommand(String command)
{

StringBuffer output = new StringBuffer();

Process p;
try
{
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line = "";

while ((line = reader.readLine())!= null)
{
output.append(line + "\n");
}

} catch (Exception e) {
e.printStackTrace();
}

return output.toString();

}

}

编辑:

我按照建议尝试使用 ProcessBuilder,但出现此错误。代码

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.*;
import java.util.*;

public class ExecuteShellCommand
{
public static void main(String[] args)
{
try
{
ProcessBuilder builder = new ProcessBuilder("cat", "/home/PepperBoy/Desktop/file1.txt","/home/PepperBoy/Desktop/file2.txt");
File combinedFile = new File("/home/PepperBoy/Desktop/file3.txt");
builder.redirectOutput(combinedFile);
builder.redirectError(combinedFile);
Process p = builder.start();
}
catch(IOException e)
{
e.printStackTrace();
}

}
}

错误

ExecuteShellCommand.java:14: cannot find symbol
symbol : method redirectOutput(java.io.File)
location: class java.lang.ProcessBuilder
builder.redirectOutput(combinedFile);

最佳答案

我找到了一个 related question .从那里找到的几个答案总结有用的东西,文件重定向需要一个 shell,但是 exec 没有 shell 上下文。幸运的是,您可以使用 ProcessBuilder 通过重定向执行进程.对于您的情况,这看起来像:

public static void main(String[] args) 
{

try{
ProcessBuilder builder = new ProcessBuilder("cat", "file1","file2");
File combinedFile = new File("combinedFile");
builder.redirectOutput(combinedFile);
builder.redirectError(combinedFile);
Process p = builder.start();
} catch(IOException e){
//handle exception...
}

}

注意:当调用 redirectErrorredirectOutput 时,您可能会收到一个错误,指出找不到该符号。如果针对 1.7 之前的 Java 版本进行编译,就会发生这种情况,因为 1.7 is when these methods were introduced.如果可以升级您的 Java,这样做将消除此错误。

如果升级 Java 是可能的,下面的代码将起作用:

public static void main(String[] args) 
{

try{
ProcessBuilder builder = new ProcessBuilder("cat", "file1","file2");
File combinedFile = new File("combinedFile");
Process p = builder.start();

InputStream isFromCat = p.getInputStream();
OutputStream osCombinedFile = new FileOutputStream(combinedFile);

byte[] buffer = new byte[1024];
int read = 0;
while((read = isFromCat.read(buffer)) != -1) {
osCombinedFile.write(buffer, 0, read);
}

} catch(IOException e){
//handle exception...
}

}

可能还值得注意的是,对 cat 进行系统调用并不是从 Java 合并文件的最佳方式。我一直假设这是一个玩具箱,可以代表您更复杂的用例。如果您真正想要做的只是组合两个文件,您应该编写代码以避免系统调用,并通过将两个文件作为输入流读入然后将它们写出到结果文件来附加文件。如果您无法弄清楚,这些细节肯定属于另一个问题。

关于java - 从 java 程序执行 cat 命令不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30610741/

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