++i
инкременты значение, затем возвращает его.
i++
возвраты значение, и затем увеличивает его.
Это - тонкое различие.
Для для цикла, используйте ++i
, поскольку это немного быстрее. i++
создаст дополнительную копию, которая просто выброшена.
Я предполагаю, что вы выполняете эти команды 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
}
(кредит: этот сайт ) и посмотрите, поможет ли это ситуации.
Спасибо за помощь, ребята, это должно помочь разобраться с происходящим в другом месте из-за этого.
Используя ваш (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);
}
}
Кажется маловероятным, что процесс действительно завершится без закрытия файлов. Может ли это происходить в очень большом количестве потоков? Или, возможно, некоторые из них на самом деле не завершаются (например, в некоторых случаях зависает на waitFor)?
В противном случае, я думаю, вы застрянете с увеличением лимита открытых файлов. Предполагая, что это Unix-подобная система, вероятно, вы ищете команду "ulimit".
Если вы используете JAVA 6, вы также можете попробовать новые сеттеры (для чтения, записи, выполнения) для объекта File. Может быть медленнее, но должно работать.