2014-11-04 5 views
0

Изнутри моего Java кода, у меня есть вызов внешней программы, я использую следующее:Выход из Exec не запись в файл в Java

int returnCodeC = 0; 
String cmnd = "dia -fa -fn res" + file1; 
final Process processCC = Runtime.getRuntime().exec(cmnd); 
BufferedReader bufC = new BufferedReader(new InputStreamReader(processCC.getInputStream())); 
returnCodeC = processCC.waitFor(); 
    } catch (Exception e1) {e1.printStackTrace();}} 

Выход вызова внешней программы диам должен быть записан в файл с именем file1 Это нормально функционировало до сегодняшнего дня. Я думаю, проблема в том, что, когда вывод из dia огромен, я не получаю выход. существует ли ограничение по размеру для BufferReader?

+0

Вы уверены, что вы еще что-нибудь от диам чтения? Я имею в виду, это может быть не ограничение буфера. –

+0

Когда я запускаю команду dia с терминала .. все работает хорошо .. даже когда я называю это из java, он работал (на всякий случай, если входные файлы, используемые dia, были маленькими .. и, следовательно, размер вывода был небольшим) теперь при запуске dia из java с большими входными файлами .. вывод (который большой) не записывается в выходной файл. – SLA

+0

Я не уверен, если это ограничение буфера ptoblem .. Я до сих пор не знаю, в чем проблема. – SLA

ответ

0

Теперь, когда я думаю, что лучше понимаю проблему, я бы посоветовал использовать processBuilder. Это позволяет вам иметь исключительный контроль над выходом proccess. Вот ссылка, которая может помочь вам: ProcessBuilder

proccess принимает массив строк в качестве аргумента, так что используйте String [] cmd = {"dia", "-fa", "-fn", "res"};

+0

Runtime.getRuntime(). Exec (cmnd); вполне доволен одной строкой. Возможно, это использование устарело, но я сомневаюсь, что это причина этой проблемы. –

+0

@SLA, я немного смущен: это (и только это) действительно решило вашу проблему? Не могли бы вы опубликовать текущий код? Благодарю. –

0

Это скорее комментарий, но ответ на поппер, но моя плохая репутация не позволяет мне оставлять комментарии.

Ваш процесс будет блокироваться, если либо 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 
    } 
    } 
+0

Он работает от оболочки .. может у, пожалуйста, прочитайте мои комментарии? Как это можно решить? – SLA

+0

К счастью, мне по крайней мере разрешено прокомментировать мои ответы. Насколько большой результат, если вы запускаете команду из оболочки? –