我希望利用unix sort命令对Java中的大型文本文件进行排序。我已尝试使用流程构建器执行排序,但没有运气。但是,当我打印确切的命令时,它将执行并将其复制并粘贴到终端中,它可以正常工作。
到目前为止,我已经尝试使用/ bin / sh -c“”执行,确保输入文件所在的目录以及输出文件的完全权限(chmod 777),但没有运气。
以下是代码(如果看起来很有趣,请注意使用Guava中的某些功能)
File inputFile = new File(inputFileName);
//build the command (optional number of sort columns)
List<String> command = new LinkedList<String>();
command.addAll(ImmutableList.<String>of("sort","-t"+delimiter));
for (int i : sortFieldPositions) {
command.add("-k"+i+","+i);
}
command.addAll(ImmutableList.<String>of(inputFileName,">",outputFileName));
//for debugging: output the command that will be executed
System.out.println("Executing: "+Joiner.on(" ").join(command));
//construct and start the process
Process process = new ProcessBuilder(command).redirectErrorStream(true).directory(inputFile.getParentFile()).start();
//for debugging: save process output
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder outputStringBuilder = new StringBuilder();
for (String line; (line = bufferedReader.readLine()) != null; /*reading taking place in check */) {
System.out.println("FROM PROCESS: "+line);
outputStringBuilder.append(line);
}
bufferedReader.close();
if (process.exitValue() != 0) {
//something went wrong
throw new RuntimeException("Error code "+process.exitValue()+" executing command: "+Joiner.on(" ").join(command)+"\n"+outputStringBuilder.toString());
}
不幸的是,这不起作用,输出如下:
Executing: sort -t, -k2,2 -k1,1 /tmp/java/TestDataSorterImporterInput.txt /tmp/java/TestDataSorterImporterOutput.txt
FROM PROCESS: sort: stat failed: >: No such file or directory
编辑:如果我从命令中删除保存输出(&gt; outputfile)可能会有所帮助,那么命令会毫无怨言地执行,并且排序的版本会显示在进程输入流的输出中
答案 0 :(得分:1)
shell知道如何执行输出重定向。排序程序不能单独完成。因此,如果你想要重定向,你需要/bin/sh -c ...
让她进入循环。
(你写道你已经尝试过这个,但其他一些东西一定出错了。)
答案 1 :(得分:0)
试试这个:
String whatever = "filename";
Process p = Runtime.getRuntime().exec("sort -t -k2 2 -k1 1 " + whatever);
请参阅this网站。
答案 2 :(得分:0)
处理流程=新的ProcessBuilder(“/ bin / bash”,“ - c”,“sort -t'|' - k2”)。start();