It is actually much more complicated than that to use Runtime.getRuntime().exec(). What happens is that you have to wait until the process completes, then it may send messages (Strings) via two streams, one representing standard output, the other representing standard error. Both these streams need to be kept "empty" otherwise you will get deadlock. The ProcessBuilder class introduced in Java5 makes the whole thing easier, by allowing you to "merge" the two streams, but to all intents and purposes you still need to use Daconta's method. I had a similar problem this time last year, and sorted it out with my StreamEater class, which you can see here,; it is only slightly changed from Daconta.