I need a java method that will read command prompt output and store it into a String to be read into Java.
This is what I have so far but isn’t working right.
public void testGetOutput() {
System.out.println("\n\n****This is the testGetOutput Method!****");
String s = null;
String query = "dir " + this.desktop;
try {
Runtime runtime = Runtime.getRuntime();
InputStream input = runtime.exec("cmd /c " + query).getInputStream();
BufferedInputStream buffer = new BufferedInputStream(input);
BufferedReader commandResult = new BufferedReader(new InputStreamReader(buffer));
String line = "";
try {
while ((line = commandResult.readLine()) != null) {
s += line + "\n";
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}//end testGetOutput()
I think the problem is when I try to change the query to be a command which will execute HandBrakeCLI.exe. Looking at my system when the program is running (but seems to have paused), it shows me that HandBrakeCLI.exe is running under a cmd window which is being run under my IDE. All that makes sense, but the HandBrakeCLI.exe doesn’t exit, so I’m guessing that’s why I can’t read the output as input to my program.
So, after that background. My big question is this: How do I get HandBrakeCLI.exe to close after it’s finished with my query so I can get its output?
Just for extra info, the only difference between the method above and the scan DVD method I have for HandBrakeCLI is the query variable is different. Like this example:
String query = "C:\Users\Kent\Desktop\HBCLI\HandBrakeCLI -t --scan -i "C:\Users\Kent\Desktop\General Conference DVDs\Sources\174th October 2004\DVD 1"; //this is actually a variable in the DVD object, but here's an example'
Oh, and by the way, when I run that query in a regular command prompt, it does exactly what I want it to, giving me all the output I desperately desire!
Here’s the original problem (I’m not sure how to resubmit a question):
I’ve been looking everywhere and can’t figure this out. I’m not sure what I’ve found is even relevant to what I want to do. I don’t have a whole lot of code for it yet, so it wont do much to put code here and I think this should be pretty simple, so I’m going to give some screenshots here. So here’s my task:
-
Scan folder which is full of ripped DVD folders (Video_TS folders with VOB files etc.) and store these folder names as the title of the DVD.
-
Scan each folder using the HandBrakeCLI and store the output to a string.
-
Regex the string to identify each title, chapter, and language.
-
Generate queries to give back to HandBrakeCLI to bulk encode each language in each chapter in each title for each DVD (you can see why I want to automate this!)
-
Store these queries in a *.bat file
The only part I’m not sure about is step 2! I can do everything else pretty easily. I’ve read a lot about OutputStreams, but I just can’t seem to understand how it works. I really just need to get the output to a string which I can regex to get the stuff I need. Here are the screenshots of what I need to input and what I need to strip from the output:
Input to HandBrakeCLI:

Output to scan:

First you need a non-blocking way to read from
Standard.outandStandard.errThen you need to tie this class into the respective
InputStreamandOutputStreamobjects.This is pretty much the boiler plate I use when I need to
Runtime.exec()anything in Java.A more advanced way would be to use
FutureTaskandCallableor at leastRunnablerather than directly extendingThreadwhich isn’t the best practice.NOTE:
The
@Nonnullannotations are in the JSR305 library. If you are using Maven, and you are using Maven aren’t you, just add this dependency to yourpom.xml.