Это скорее комментарий, но ответ на поппер, но моя плохая репутация не позволяет мне оставлять комментарии.
Ваш процесс будет блокироваться, если либо stdout, либо stderr переполнит их соответствующий размер буфера.
Попробуйте использовать команду в оболочке, чтобы узнать, что произойдет, и начните читать темы stdterr и stdout.
Редактировать: вот что я нашел в сети, и это работает для меня, когда мне не нужны данные stdout и stderr, а только команда для запуска. Я вызываю dropOutput непосредственно перед processCC.waitFor().
private int dropOutput(final Process p) {
final Thread t = new Thread("drop") {
@Override
public void run() {
_dropOutput(p);
};
};
t.start();
int ev = 0;
Timer timer = null;
try {
timer = new Timer(true);
final InterruptTimerTask interrupter = new InterruptTimerTask(Thread.currentThread());
timer.schedule(interrupter, 2 /*seconds*/* 1000 /*milliseconds per second*/);
if (p.waitFor() != 0) {
ev = p.exitValue();
}
} catch (final InterruptedException e) {
// e.printStackTrace();
} finally {
timer.cancel(); // If the process returns within the timeout period, we have to stop the interrupter
// so that it does not unexpectedly interrupt some other code later.
Thread.interrupted(); // We need to clear the interrupt flag on the current thread just in case
// interrupter executed after waitFor had already returned but before timer.cancel
// took effect.
//
// Oh, and there's also Sun bug 6420270 to worry about here.
}
return ev;
}
/**
* Just a simple TimerTask that interrupts the specified thread when run.
*/
class InterruptTimerTask extends TimerTask {
private final Thread thread;
public InterruptTimerTask(final Thread t) {
this.thread = t;
}
@Override
public void run() {
thread.interrupt();
}
}
private void _dropOutput(final Process p) {
final InputStream istrm = p.getInputStream();
// final InputStream istrm = p.getErrorStream();
final InputStreamReader istrmrdr = new InputStreamReader(istrm);
final BufferedReader buffrdr = new BufferedReader(istrmrdr);
@SuppressWarnings("unused")
String data;
try {
while ((data = buffrdr.readLine()) != null) {
// System.out.println(data);
}
} catch (final IOException e) {
// do nothing
}
}
Вы уверены, что вы еще что-нибудь от диам чтения? Я имею в виду, это может быть не ограничение буфера. –
Когда я запускаю команду dia с терминала .. все работает хорошо .. даже когда я называю это из java, он работал (на всякий случай, если входные файлы, используемые dia, были маленькими .. и, следовательно, размер вывода был небольшим) теперь при запуске dia из java с большими входными файлами .. вывод (который большой) не записывается в выходной файл. – SLA
Я не уверен, если это ограничение буфера ptoblem .. Я до сих пор не знаю, в чем проблема. – SLA