我试图使用java代码中的unix命令计算文本文件的行数。
我的代码如下:
String filePath = "/dir1/testFile.txt";
Runtime rt = Runtime.getRuntime();
Process p;
try {
System.out.println("No: of lines : ");
findLineCount = "cat " + filePath + " | wc -l";
p = rt.exec(findLineCount);
p.waitFor();
} catch (Exception e) {
//code
}
但是,控制台中没有显示任何内容。当我直接执行命令时,它可以工作。上面代码中的问题可能是什么?
答案 0 :(得分:3)
我建议您使用ProcessBuilder
代替Runtime.exec
。您还可以通过将filePath传递给wc
来简化命令。请不要吞下Exception
(s)。最后,您可以使用ProcessBuilder.inheritIO()
(将子进程标准I / O的源和目标设置为与当前Java进程的源和目标相同),如
String filePath = "/dir1/testFile.txt";
try {
System.out.println("No: of lines : ");
ProcessBuilder pb = new ProcessBuilder("wc", "-l", filePath);
pb.inheritIO();
Process p = pb.start();
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
当然,在不产生新进程的情况下计算Java中的行数会更有效。也许是,
int count = 0;
String filePath = "/dir1/testFile.txt";
try (Scanner sc = new Scanner(new File(filePath));) {
while (sc.hasNextLine()) {
String line = sc.nextLine();
count++;
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.printf("No: of lines : %d%n", count);
答案 1 :(得分:2)
直接执行命令时
我怀疑你是“直接”执行它。你可能正在shell中运行它。
您的代码也应该在shell中运行该脚本。
rt.exec(new String[]("bash", "-c", findLineCount});
答案 2 :(得分:0)
这是我打印行数的方式
public static void main(String[] args) {
try {
Runtime run = Runtime.getRuntime();
String[] env = new String[] { "path=%PATH%;" + "your shell path " }; //path of cigwin bin or any similar application. this is needed only for windows
Process proc = run.exec(new String[] { "bash.exe", "-c", "wc -l < yourfile" }, env);
BufferedReader reader = new BufferedReader(new InputStreamReader(
proc.getInputStream()));
String s;
while ((s = reader.readLine()) != null) {
System.out.println("Number of lines " + s);
}
proc.waitFor();
int exitValue = proc.exitValue();
System.out.println("Status {}" + exitValue);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}