Я хочу создать разность двух файлов. Я пытался искать код в Java, который делает это, но не нашел простой код / служебным кодом для этого. Следовательно, я думал, могу ли я так или иначе запустить Linux diff/sdiff, команда от моего Java кодируют и заставляют его возвратить файл, который хранит разность затем, это было бы большим.
Предположим, что существует два файла fileA и fileB. Я должен смочь сохранить их разность в файле, названном fileDiff через мой код Java. Затем выбирающие данные из fileDiff не были бы никаким грандиозным предприятием.
Взгляните на метод Runtime.exec (): http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec (java.lang.String)
Вы можете использовать java.lang.Runtime.exec
для выполнения простого кода. Это возвращает вам процесс
, и вы можете читать его стандартный вывод напрямую, без необходимости временно сохранять вывод на диск.
Например, вот полная программа, которая продемонстрирует, как это сделать:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class testprog {
public static void main(String args[]) {
String s;
Process p;
try {
p = Runtime.getRuntime().exec("ls -aF");
BufferedReader br = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((s = br.readLine()) != null)
System.out.println("line: " + s);
p.waitFor();
System.out.println ("exit: " + p.exitValue());
p.destroy();
} catch (Exception e) {}
}
}
При компиляции и запуске она выводит:
line: ./
line: ../
line: .classpath*
line: .project*
line: bin/
line: src/
exit: 0
как и ожидалось.
Вы также можете получить поток ошибок для стандартной ошибки процесса и поток вывода для стандартного ввода процесса, что довольно сбивает с толку. В этом контексте ввод и вывод меняются местами, поскольку это ввод из процесса в этот (т. Е. Стандартный вывод процесса).
Если вы хотите объединить стандартный вывод процесса и ошибку из Java (в отличие от использования 2> & 1
в фактической команде), вам следует изучить ProcessBuilder
.
Вы также можете написать файл сценария оболочки и вызвать этот файл из кода Java. как показано ниже
{
Process proc = Runtime.getRuntime().exec("./your_script.sh");
proc.waitFor();
}
Запишите команды linux в файл сценария, после завершения выполнения вы сможете прочитать файл diff в Java.
Преимущество этого подхода в том, что вы можете изменять команды без изменения кода Java.
Вам не нужно сохранять разницу в третьем файле, а затем читать из него. Вместо этого вы используете Runtime.exec
Process p = Runtime.getRuntime().exec("diff fileA fileB");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
Runtime run = Runtime.getRuntime();
//The best possible I found is to construct a command which you want to execute
//as a string and use that in exec. If the batch file takes command line arguments
//the command can be constructed a array of strings and pass the array as input to
//the exec method. The command can also be passed externally as input to the method.
Process p = null;
String cmd = "ls";
try {
p = run.exec(cmd);
p.getErrorStream();
p.waitFor();
}
catch (IOException e) {
e.printStackTrace();
System.out.println("ERROR.RUNNING.CMD");
}finally{
p.destroy();
}