我正在尝试使用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.另外,我不想要以字节为单位的文件大小,我只需要获得总行数。
答案 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()