Обработайте Разработчика waitFor () проблема и Открытые ограничения файла

++i инкременты значение, затем возвращает его.

i++ возвраты значение, и затем увеличивает его.

Это - тонкое различие.

Для для цикла, используйте ++i, поскольку это немного быстрее. i++ создаст дополнительную копию, которая просто выброшена.

9
задан Gray 5 July 2012 в 18:30
поделиться

4 ответа

Я предполагаю, что вы выполняете эти команды chmod в цикле - иначе я не понимаю, почему вы получаете так много исключений. Возможно, вы попали в тупик, потому что не читаете вывод порожденных процессов. Это определенно меня укусило до ProcessBuilder , Runtime.exec () дней.

Измените фрагмент кода на приведенный выше шаблон:

try {
    ProcessBuilder pb = new ProcessBuilder("/bin/chmod", "777", path);    
    pb.redirectErrorStream(true); // merge stdout, stderr of process

    Process p = pb.start();
    InputStreamReader isr = new  InputStreamReader(p.getInputStream());
    BufferedReader br = new BufferedReader(isr);

    String lineRead;
    while ((lineRead = br.readLine()) != null) {
        // swallow the line, or print it out - System.out.println(lineRead);
    }

    int rc = p.waitFor();
    // TODO error handling for non-zero rc
}
catch (IOException e) {
    e.printStackTrace(); // or log it, or otherwise handle it
}
catch (InterruptedException ie) {
    ie.printStackTrace(); // or log it, or otherwise handle it
} 

(кредит: этот сайт ) и посмотрите, поможет ли это ситуации.

14
ответ дан 4 December 2019 в 10:33
поделиться

Спасибо за помощь, ребята, это должно помочь разобраться с происходящим в другом месте из-за этого.

Используя ваш (Vinay) пример и закрытие потока:

try{ 
  fw.close();

  ProcessBuilder pb = new ProcessBuilder("/bin/chmod", "777", path);

  pb.redirectErrorStream(true); // merge stdout, stderr of process
  p = pb.start();

  InputStreamReader isr = new  InputStreamReader(p.getInputStream());
  BufferedReader br = new BufferedReader(isr);

  String lineRead;
  while ((lineRead = br.readLine()) != null) {
    // swallow the line, or print it out - System.out.println(lineRead);
  }

} catch (Exception ioe) {
  Logger.logException(Logger.WARN, ioe.getMessage(), ioe);
} finally {
  try {
    p.waitFor();//here as there is some snipped code that was causing a different
                // exception which stopped it from getting processed

    //missing these was causing the mass amounts of open 'files'
    p.getInputStream().close();
    p.getOutputStream().close();
    p.getErrorStream().close(); 

  } catch (Exception ioe) {
    Logger.logException(Logger.WARN, ioe.getMessage(), ioe);
  }
}

Позаимствовал идею из сообщения Джона Б. Мэтьюза .

6
ответ дан 4 December 2019 в 10:33
поделиться

Кажется маловероятным, что процесс действительно завершится без закрытия файлов. Может ли это происходить в очень большом количестве потоков? Или, возможно, некоторые из них на самом деле не завершаются (например, в некоторых случаях зависает на waitFor)?

В противном случае, я думаю, вы застрянете с увеличением лимита открытых файлов. Предполагая, что это Unix-подобная система, вероятно, вы ищете команду "ulimit".

0
ответ дан 4 December 2019 в 10:33
поделиться

Если вы используете JAVA 6, вы также можете попробовать новые сеттеры (для чтения, записи, выполнения) для объекта File. Может быть медленнее, но должно работать.

0
ответ дан 4 December 2019 в 10:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: