Я хочу проанализировать содержимое некоторого файла с помощью srcML parser, который является внешней программой Windows. Я делаю это следующим образом:
String command = "src2srcml.exe --language java";
Process proc = Runtime.getRuntime().exec(command);
InputStream fileInput = Files.newInputStream(file)
OutputStream procOutput = proc.getOutputStream();
IOUtils.copy(fileInput, procOutput);
IOUtils.copy() из библиотеки Commons IO 2.4.
Когда мой файл небольшой (несколько КБ), все работает нормально. Однако, когда я пытаюсь скопировать некоторый относительно большой файл (~ 72 КБ), моя программа зависает.
Более того, когда я выполняю парсер "вручную" в cmd:
src2srcml.exe --language Java < BigFile.java
все отлично работает.
Есть идеи, почему это происходит?
Вы должны буферизировать OutputStream:
OutputStream procOutput = proc.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(procOutput);
IOUtils.copy(fileInput, bos);
Более того, почему бы вам просто не перенаправить fileInput как процесс InputStream?
ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectInput(file);
Process proc = pb.start();
proc.waitFor();
Проблема, скорее всего, в том, что вы не потребляете выход внешней программы в отдельном потоке. вам нужно запустить отдельный поток, чтобы потреблять выходной сигнал, чтобы внешняя программа не блокировалась.