Вообще говоря, реализации разрешается выполнять такие оптимизации, если они не влияют на наблюдаемые (функциональные) результаты программы. В случае printf()
это будет означать, что если программа не использует возвращаемое значение и если нет %n
преобразований, то реализации будет разрешено ничего не делать.
На практике мне неизвестно о какой-либо реализации в Linux, которая в настоящее время (начало 2019 г.) выполняет такую оптимизацию - компиляторы и библиотеки, с которыми я знаком, отформатируют вывод и запишут результат на нулевое устройство, полагаясь на на ядро ", чтобы игнорировать это.
Возможно, вы захотите написать собственную функцию пересылки, если вам действительно нужно сэкономить на стоимости форматирования, когда вывод не используется - вам нужно вернуть void
, и вам следует проверить строку формата для %n
. (Вы можете использовать snprintf
с буфером NULL
и 0
, если вам нужны эти побочные эффекты, но экономия вряд ли окупит вложенные усилия).
Я подозреваю (если/до кто-то не отправляет ответ об обратном), что нет никакого способа сделать это в стандартной библиотеке Java, потому что полномочия группы POSIX (rwxrwxrwx вид, к которому Вы привыкли) не являются межплатформенными. Java 6 позволит Вам полномочия владельца набора или глобальные полномочия, но (насколько я могу сказать), не полномочия группы. Если действительно необходимо сделать это, попытайтесь использовать Runtime.exec("chmod g+w directory")
, но это могла бы быть хорошая идея стилистически для обертывания его в метод как setGroupWritable()
.
Хорошо это не решение Java и определенно не портативное.
Так как Вы упоминаете, что Вы - Linux, вероятно, можно думать о проверке "umask" настроек, и установка его соответственно (чтобы создать каталоги с группой пишут полномочия), и затем запуск программы Java.
На java 6 существуют методы, которые позволяют Вам делать это, как setwriteable (). На предыдущих версиях Java необходимо будет получить доступ к командной строке, чтобы сделать команду chmod.
Документ класса файла Java 6 SE.
Править: Ой, я абсолютно неправ; мне не удалось заметить, что Вы хотели полномочия группы конкретно. Они, кажется, не устанавливаемы без Runtime.exec ().
@David: Вы правы.
Другая мысль: если у Вас есть много файлов для изменения, как насчет того, чтобы писать сценарий оболочки и назвать это от runtime.exec ()?