gpt4 book ai didi

java - 在 Java 中将文件作为命令行参数传递

转载 作者:行者123 更新时间:2023-12-01 11:22:38 26 4
gpt4 key购买 nike

我正在尝试用 Java 编写一个程序,以便在命令行中对给定文件运行 pdfgrep,但我无法执行它。

我编写了以下代码:

public class PDFGrepCall {
public static void main(String[] args) throws IOException, InterruptedException{
PDFGrepCall obj = new PDFGrepCall();

String searchterm = "git";
String filename = "~/Documents/COMP2100/03git.slides.pdf";
String newsearch = "'"+searchterm+"'";
String command="pdfgrep -c "+newsearch+" "+filename;
System.out.println(command);

StringBuffer output = new StringBuffer();
Process p;

p=Runtime.getRuntime().exec(command);
p.waitFor();

BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = reader.readLine();
while ((line=reader.readLine())!=null) {
output.append(line+"\n");
}

System.out.println(output.toString());

}

这应该打印我编写的命令,并在新行上打印命令的结果(在本例中为数字 57)。但是,当我运行它时,程序不会给出命令的结果,只是在命令后打印换行符并终止。

我可以确认 java 之外的命令本身工作得很好,并且文件存在于给定的位置。

我是否错过了从 Java 向命令行函数传递文件参数的过程?我应该怎么做才能正确执行此任务?

编辑:解决如下。应该使用 processbuilder 并将目录更改为 home 而不是使用“~”来正确完成。

最佳答案

我相信你会发现~没有被正确中断(它被认为是一个文字并且没有被exec函数扩展)

例如,如果我使用类似...

    ProcessBuilder pb = new ProcessBuilder("ls", "~");
pb.redirectErrorStream(true);

try {
Process p = pb.start();
InputStream is = null;
try {
is = p.getInputStream();
int in = -1;
while ((in = is.read()) >= 0) {
System.out.print((char) in);
}
} finally {
try {
if (is != null) {
is.close();
}
} catch (Exception e) {
}
}
System.out.println("Exited with " + p.waitFor());
} catch (IOException exp) {
exp.printStackTrace();
} catch (InterruptedException exp) {
exp.printStackTrace();
}

它输出:

ls: cannot access ~: No such file or directory
Exited with 2

但是如果我把它改成

ProcessBuilder pb = new ProcessBuilder("ls");

效果很好。

如果您需要用户主目录,那么您需要自己中断它,例如使用System.getProperty("user.home")

ProcessBuilder pb = new ProcessBuilder("ls", System.getProperty("user.home"));

我还强烈建议使用ProcessBuilder,它允许您将错误流重定向到(以及其他地方)InputStream,这将使生活变得更加美好。更容易并更改执行进程的“工作”目录,它还可以更好地处理带有空格的参数,这意味着您可以执行类似的操作...

ProcessBuilder pb = new ProcessBuilder("ls");
pb.directory(new File(System.getProperty("user.home")));

并得到与之前相同的结果

进一步测试...

没有安装pdfgrep,我想我可以尝试grep

ProcessBuilder pb = new ProcessBuilder("grep", "-i", "banana", "~/Test.txt");

这导致了

grep: ~/Test.txt: No such file or directory
Exited with 2

(是的,Test.txt 位于主目录中)

当我将其更改为

ProcessBuilder pb = new ProcessBuilder("grep", "-i", "banana", "Test.txt");
pb.directory(new File(System.getProperty("user.home")));

结果是

Bananas are yellow
Exited with 0

关于java - 在 Java 中将文件作为命令行参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31063241/

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