Unix计数文件命令行 - 来自java代码

时间:2014-12-08 06:13:04

标签: java unix

我试图使用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
}

但是,控制台中没有显示任何内容。当我直接执行命令时,它可以工作。上面代码中的问题可能是什么?

3 个答案:

答案 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();
        } 
    }