2015-02-17 2 views
4

У меня есть инструмент Java с помощью следующего кода:выхода процесса является слишком большим

Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec(cmd); 

// any error message? 
StreamGobblerLocal errorGobbler = new StreamGobblerLocal(proc.getErrorStream(), "ERROR"); 

// any output? 
StreamGobblerLocal outputGobbler = new StreamGobblerLocal(proc.getInputStream(), "OUTPUT"); 

// kick them off 
errorGobbler.start(); 
outputGobbler.start(); 

// any error??? 
int exitVal = proc.waitFor(); 
commandResultBean.setCLI_ReturnValue(exitVal); 

Это работает, но когда выход подпроцесса является большим, ТУПИКИ. Я почти уверен, что проблема здесь в следующем:

Поскольку некоторые местные платформы только обеспечивают ограниченный размер буфера для стандартных входных и выходных потоков, неспособность быстро записать входной поток или читать выходной поток подпроцесс может вызвать подпроцесс блокировки или даже тупик.

Я нашел его здесь: http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html

Как я могу решить эту проблему? Большой вывод похож на 30000 строк в «Блокноте», и мне приходится регистрировать эти строки.

Мой код был скопирован из этой статьи, поэтому вы можете проверить реализации, которые я не копировал здесь.

http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html

Пожалуйста, обратите внимание, что я не первый разработчик инструмента, так что я с трудом могу ответить на такие вопросы, как «Почему вы используете это» или подобные вопросы.

Любая помощь приветствуется, спасибо заранее.

ответ

3

Через неделю я решил поделиться тем, что я сделал в этой ситуации. Лучшие ответы по-прежнему оцениваются.

Это как обходной путь, но работает очень хорошо. Вы можете добавить эту строку:

cmd += " >> " + outputFileName; 

Таким образом CMD на Windows, и Баш на Mac (Unix) тоже будет делать работу и пропустить Java роль в процессе регистрации. Также вы можете прочитать файл обратно с помощью другого метода, который может обрабатывать этот большой объем данных и использовать вывод в любом месте вашего кода.

Надеюсь, что этот ответ будет полезен.

+0

Я столкнулся с подобной проблемой, но ответ, который вы предлагаете выше, вызывает у меня проблемы с Linux, потому что мне нужно использовать много потоков и блокировать их, в любом случае спасибо за обмен –

Смежные вопросы