如何使用java获取linux中文件的总行数

时间:2015-04-09 09:24:13

标签: java linux

我正在尝试使用wc -l filename运行Runtime.getRuntime().exec(command)命令并获取总行数。但它没有用。

这是我的代码:

private String executeCommand(String command) {
    StringBuffer output = new StringBuffer();
    Process p;
    try {
        System.out.println(command);
        p = Runtime.getRuntime().exec(command);
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(p.getInputStream()));

        String line = "";           
        while ((line = reader.readLine())!= null) {
            output.append(line.split("\\s+")[0] + "\n");
        }

        int exc = p.waitFor();
        System.out.println(exc);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return output.toString();
}

exc(退出值)为零。当我打印我正在传递的命令时,它会给出正确的命令。我也尝试复制该命令并在Linux中运行它。它正在运作,但不是通过程序。

我在functionexecuteCommand中传递给命令变量的命令是:     wc -l< LOG1

它包含的总行数约为4597110.另外,我不想要以字节为单位的文件大小,我只需要获得总行数。

5 个答案:

答案 0 :(得分:4)

获取行的更简单的替代方法(使用Java 8)。

long lines = Files.lines(Paths.get("foo.txt")).count();

答案 1 :(得分:3)

如果您使用的是Java 8或更高版本,Kayaman会有更好的答案。但是,如果您仍然坚持早期的迭代,请参阅下文。


您会看到用于评估wc输出的位代码:

while ((line = reader.readLine())!= null) {
    output.append(line.split("\\s+")[0] + "\n");
}

那个非常类似于可以直接读取文件并计算行数的代码。

所以我不完全确定为什么你认为需要调用外部程序来执行此任务,尤其是因为它会降低代码的可移植性。

只需打开文件并读取行,每行添加一个计数器。你有它,行数。

例如,请参阅以下文件:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
public class Test
{
    static private int getLineCount(String fspec) {
        String line;
        int count = 0;
        try {
            BufferedReader reader = new BufferedReader(
                new FileReader(new File(fspec)));
            while ((line = reader.readLine())!= null)
                count++;
        } catch (Exception e) {
            count = -1;
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println (getLineCount("/tmp/tempfile"));
    }
}

运行此功能与140

的输出一样wc -l
pax> wc -l /tmp/tempfile 
140 /tmp/tempfile

答案 2 :(得分:0)

看起来您没有传递正确的文件路径,请在运行方法时尝试此操作:

URL fileName = ClassLoader.getSystemClassLoader().getResource("filename");

System.out.println(executeCommand("wc -l " + fileName.getPath()));

答案 3 :(得分:0)

尝试以下列方式使用Process

ProcessBuilder pb = new ProcessBuilder("wc", "-l");

try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));){ 
    Process process = pb.start();                
    while (reader.readLine() != null){
        // you need to figure out in which line the 
        // relevant output is and parse that to int
        // just look at some sample outputs of wc -l
    }
    int err = process.waitFor();
    if(err!=0) {
        // your code for processing the number of lines goes here
        // the command finished without error
    }
    else {
        // your code here in case the command had an error
    }
 } catch (Exception e){
    // catch an Exception like IOException or InterruptedException here
 }

基本上Reader将读取命令的输出,该命令在执行命令时将转到终端。

答案 4 :(得分:0)

您可以使用apache common io FileUtils.readLines(File file)

FileUtils.readLines(new File("filename.txt")).size()