How to run Linux commands in Java?

Javaruntime.exec

Java Problem Overview


I want to create diff of two files. I tried searching for code in Java that does it, but didnt find any simple code/ utility code for this. Hence, I thought if I can somehow run linux diff/sdiff command from my java code and make it return a file that stores the diff then it would be great.

Suppose there are two files fileA and fileB. I should be able to store their diff in a file called fileDiff through my java code. Then fetching data from fileDiff would be no big deal.

Java Solutions


Solution 1 - Java

You can use java.lang.Runtime.exec to run simple code. This gives you back a Process and you can read its standard output directly without having to temporarily store the output on disk.

For example, here's a complete program that will showcase how to do it:

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) {}
    }
}

When compiled and run, it outputs:

line: ./
line: ../
line: .classpath*
line: .project*
line: bin/
line: src/
exit: 0

as expected.

You can also get the error stream for the process standard error, and output stream for the process standard input, confusingly enough. In this context, the input and output are reversed since it's input from the process to this one (i.e., the standard output of the process).

If you want to merge the process standard output and error from Java (as opposed to using 2>&1 in the actual command), you should look into ProcessBuilder.

Solution 2 - Java

You can also write a shell script file and invoke that file from the java code. as shown below

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

Write the linux commands in the script file, once the execution is over you can read the diff file in Java.

The advantage with this approach is you can change the commands with out changing java code.

Solution 3 - Java

You need not store the diff in a 3rd file and then read from in. Instead you make use of the 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);
}

Solution 4 - Java

try to use unix4j. it s about a library in java to run linux command. for instance if you got a command like: cat test.txt | grep "Tuesday" | sed "s/kilogram/kg/g" | sort in this program will become: Unix4j.cat("test.txt").grep("Tuesday").sed("s/kilogram/kg/g").sort();

Solution 5 - Java

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

Solution 6 - Java

You can call run-time commands from java for both Windows and 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();
             }  
    }
}

Hope it Helps.. :)

Solution 7 - Java

The suggested solutions could be optimized using commons.io, handling the error stream, and using Exceptions. I would suggest to wrap like this for use in Java 8 or later:

public static List<String> execute(final String command) throws ExecutionFailedException, InterruptedException, IOException {
	try {
		return execute(command, 0, null, false);
	} catch (ExecutionTimeoutException e) { return null; } /* Impossible case! */
}

public static List<String> execute(final String command, final long timeout, final TimeUnit timeUnit) throws ExecutionFailedException, ExecutionTimeoutException, InterruptedException, IOException {
	return execute(command, 0, null, true);
}

public static List<String> execute(final String command, final long timeout, final TimeUnit timeUnit, boolean destroyOnTimeout) throws ExecutionFailedException, ExecutionTimeoutException, InterruptedException, IOException {
	Process process = new ProcessBuilder().command("bash", "-c", command).start();
	if(timeUnit != null) {
		if(process.waitFor(timeout, timeUnit)) {
			if(process.exitValue() == 0) {
				return IOUtils.readLines(process.getInputStream(), StandardCharsets.UTF_8);
			} else {
				throw new ExecutionFailedException("Execution failed: " + command, process.exitValue(), IOUtils.readLines(process.getInputStream(), StandardCharsets.UTF_8));
			}
		} else {
			if(destroyOnTimeout) process.destroy();
			throw new ExecutionTimeoutException("Execution timed out: " + command);
		}
	} else {
		if(process.waitFor() == 0) {
			return IOUtils.readLines(process.getInputStream(), StandardCharsets.UTF_8);
		} else {
			throw new ExecutionFailedException("Execution failed: " + command, process.exitValue(), IOUtils.readLines(process.getInputStream(), StandardCharsets.UTF_8));
		}
	}
}

public static class ExecutionFailedException extends Exception {
	
	private static final long serialVersionUID = 1951044996696304510L;

	private final int exitCode;
	private final List<String> errorOutput;
	
	public ExecutionFailedException(final String message, final int exitCode, final List<String> errorOutput) {
		super(message);
		this.exitCode = exitCode;
		this.errorOutput = errorOutput;
	}

	public int getExitCode() {
		return this.exitCode;
	}

	public List<String> getErrorOutput() {
		return this.errorOutput;
	}
	
}

public static class ExecutionTimeoutException extends Exception {
	
	private static final long serialVersionUID = 4428595769718054862L;

	public ExecutionTimeoutException(final String message) {
		super(message);
	}
	
}

Solution 8 - Java

if the opening in windows

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

Solution 9 - Java

ProcessBuilder processBuilder = new ProcessBuilder();

// -- Linux --

// Run a shell command
processBuilder.command("bash", "-c", "ls /home/kk/");

// Run a shell script
//processBuilder.command("path/to/hello.sh");

// -- Windows --

// Run a command
//processBuilder.command("cmd.exe", "/c", "dir C:\\Users\\kk");

// Run a bat file
//processBuilder.command("C:\\Users\\kk\\hello.bat");

try {

	Process process = processBuilder.start();

	StringBuilder output = new StringBuilder();

	BufferedReader reader = new BufferedReader(
			new InputStreamReader(process.getInputStream()));

	String line;
	while ((line = reader.readLine()) != null) {
		output.append(line + "\n");
	}

	int exitVal = process.waitFor();
	if (exitVal == 0) {
		System.out.println("Success!");
		System.out.println(output);
		System.exit(0);
	} else {
		//abnormal...
	}

} catch (IOException e) {
	e.printStackTrace();
} catch (InterruptedException e) {
	e.printStackTrace();
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionchitreshView Question on Stackoverflow
Solution 1 - JavapaxdiabloView Answer on Stackoverflow
Solution 2 - JavaNaveenView Answer on Stackoverflow
Solution 3 - JavacodaddictView Answer on Stackoverflow
Solution 4 - Javab10n1kView Answer on Stackoverflow
Solution 5 - JavaYoKView Answer on Stackoverflow
Solution 6 - JavaSarat ChandraView Answer on Stackoverflow
Solution 7 - JavaMartinView Answer on Stackoverflow
Solution 8 - JavanugrahaTetenView Answer on Stackoverflow
Solution 9 - JavaKailas KakadeView Answer on Stackoverflow