Подтвердить что ты не робот

Как запустить команды linux в java-коде?

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

Предположим, что есть два файла fileA и fileB. Я должен иметь возможность хранить их diff в файле с именем fileDiff через мой java-код. Тогда выборка данных из fileDiff не была бы большой проблемой.

4b9b3361

Ответ 2

Вы можете использовать java.lang.Runtime.exec для запуска простого кода. Это дает вам Process, и вы можете напрямую прочитать его стандартный вывод, не временно сохраняя вывод на диске.

Например, здесь представлена ​​полная программа, которая продемонстрирует, как это сделать:

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.

Ответ 3

Вы также можете написать файл оболочки script и вызвать этот файл из java-кода. как показано ниже

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

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

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

Ответ 4

Вам не нужно хранить diff в третьем файле, а затем читать с. Вместо этого вы используете 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);
}

Ответ 5

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();
}  

Ответ 6

попробуйте использовать unix4j. это о библиотеке в java для запуска команды linux. например, если у вас есть команда вроде: cat test.txt | grep "Вторник" | sed "s/kilogram/kg/g" | Сортировать в этой программе станут: Unix4j.cat( "test.txt" ) Grep ( "вторник" ) СЭД ( "S/кг/кг/г" ) своего рода();...

Ответ 7

если открытие в окнах

try {
        //chm file address
        String chmFile = System.getProperty("user.dir") + "/chm/sample.chm";
        Desktop.getDesktop().open(new File(chmFile));
    } catch (IOException ex) {
        Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
        {
            JOptionPane.showMessageDialog(null, "Terjadi Kesalahan", "Error", JOptionPane.WARNING_MESSAGE);
        }
    }

Ответ 8

Вы можете вызывать команды run-time из java для Windows и Linux.

import java.io.*;

public class Test{
   public static void main(String[] args) 
   {
            try
            { 
            Process process = Runtime.getRuntime().exec("pwd"); // for Linux
            //Process process = Runtime.getRuntime().exec("cmd /c dir"); //for Windows

            process.waitFor();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
               while ((line=reader.readLine())!=null)
               {
                System.out.println(line);   
                }
             }       
                catch(Exception e)
             { 
                 System.out.println(e); 
             }
             finally
             {
               process.destroy();
             }  
    }
}

Надеюсь, что это поможет...:)