Как выполнить команды Linux в Java?

Я хочу создать разность двух файлов. Я пытался искать код в Java, который делает это, но не нашел простой код / служебным кодом для этого. Следовательно, я думал, могу ли я так или иначе запустить Linux diff/sdiff, команда от моего Java кодируют и заставляют его возвратить файл, который хранит разность затем, это было бы большим.

Предположим, что существует два файла fileA и fileB. Я должен смочь сохранить их разность в файле, названном fileDiff через мой код Java. Затем выбирающие данные из fileDiff не были бы никаким грандиозным предприятием.

41
задан jww 25 February 2019 в 18:58
поделиться

5 ответов

24
ответ дан 27 November 2019 в 00:15
поделиться

Вы можете использовать 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 .

47
ответ дан 27 November 2019 в 00:15
поделиться

Вы также можете написать файл сценария оболочки и вызвать этот файл из кода Java. как показано ниже

{
   Process proc = Runtime.getRuntime().exec("./your_script.sh");                        
   proc.waitFor();
}

Запишите команды linux в файл сценария, после завершения выполнения вы сможете прочитать файл diff в Java.

Преимущество этого подхода в том, что вы можете изменять команды без изменения кода Java.

16
ответ дан 27 November 2019 в 00:15
поделиться

Вам не нужно сохранять разницу в третьем файле, а затем читать из него. Вместо этого вы используете 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);
}
12
ответ дан 27 November 2019 в 00:15
поделиться
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();
}  
5
ответ дан 27 November 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: