Как изменить режим разрешения изображения на 777 использующих кодов Java?

1127 Проблема двоякая. Прежде всего, Haskell чувствителен к отступам, например следующий код недействителен:

example = (a, b)
  where
    a = "Hello"
     b = "World"

Обе привязки должны иметь одинаковое количество пробелов / табуляций (см. правило офсайда ). Хотя в данном случае это очевидно, в следующем он довольно скрыт, где я обозначаю пробел · и табуляцию »:

example = (a, b)
··where
····a = "Hello"
»   b = "World"

Это будет выглядеть как действительный код на Haskell, если редактор покажет вкладки, выровненные по коэффициентам, кратным четырем. Но это не так. Вкладки на Haskell выровнены по кратному восьми, поэтому код будет интерпретироваться следующим образом:

example = (a, b)
··where
····a = "Hello"
»       b = "World"

Во-вторых, если вы используете только вкладки, вы можете получить макет, который выглядит неправильно. Например, следующий код выглядит правильно, если вкладка отображается с шестью или более пробелами (в нашем случае восемь):

example = (a, b)
»       where»  a = "Hello"
»       »       b = "World"

Но в другом редакторе, который использует 4 пробела, он больше не будет выглядеть правильно:

example = (a, b)
»   where»  a = "Hello"
»   »   b = "World"

Это все еще правильно, хотя. Тем не менее, тот, кто привык к пробелам, может переопределить b 'связывание с пробелами и закончиться ошибкой парсера.

Если вы применяете кодовое соглашение в своем коде, которое гарантирует, что вы используете только табуляции в начале строки и новую строку после where, let или do, вы можете избежать некоторых проблем ( см. 11 ). Тем не менее, текущие выпуски GHC по умолчанию предупреждают о вкладках , потому что они имеют , были , источник из много ошибок синтаксического анализатора в прошлом, так что вы, вероятно, хотите избавиться и от них.

См. Также

8
задан Bill the Lizard 3 October 2012 в 23:01
поделиться

4 ответа

Это часть пакета NIO. Вы можете сделать это через java.nio.file.attribute.PosixFilePermission .

Это только в Java 1.7 , хотя это была известная проблема на какое-то время.

3
ответ дан 5 December 2019 в 08:00
поделиться

Вы можете создать объект File , связанный с файлом, а затем изменить разрешения с помощью setExecutable , setReadable и setWritable . Естественно, эти операции завершатся ошибкой, если у вашей программы нет разрешения на изменение прав доступа к файлу.

8
ответ дан 5 December 2019 в 08:00
поделиться

К сожалению, Java дает мало возможностей для доступа к свойствам системного файла, потому что это нарушит золотое правило java «пиши один раз, запускай везде».

Действительно, когда вы пишете, что вы хотите поместить доступ 777 к файлу, это, очевидно, означает, что вы находитесь под unix. Но что означал бы такой запрос, например, под Windows?

Поэтому неудивительно, что для решения конкретных тем, связанных с ОС, вам придется использовать определенные функции. Это цена, которую приходится платить за использование языка, который заявляет (с серьезными причинами) как «платформо-независимый»

. Более безопасным способом было бы использование библиотеки JNI, которая реализует именно то, что вы хотите. Простым, но грязным и опасным способом было бы использование Runtime.getRuntime (). Exec ("chmod 777 myFile").

Почему опасно? На самом деле, что происходит, когда вызывается такой exec ("blahblah")?

Процесс unix, выполняющий вашу программу java, разветвляется; затем "дублированный" процесс запускает оболочку (ksh? csh? bash ?? это зависит от вашей конфигурации unix), которая пытается понять и запустить ваше предложение "blahblah".

Если ваш jvm фактически использует 500 МБ, разветвленный процесс будет иметь тот же размер при запуске ...

Тогда оболочка будет запускаться с тем же «контекстом оболочки», что и процесс Java, то есть с тем же ПУТЬом, псевдонимами и так далее. Даже «chmod» мог иметь псевдоним, поэтому было бы лучше назвать полный путь для chmod (/ bin / chmod, / usr / bin / chmod ... это зависит от вкуса unix ...

1
ответ дан 5 December 2019 в 08:00
поделиться

Вы можете использовать метод exec для запуска внешней команды для выполнения chmod.

Runtime.getRuntime().exec( "chmod 777 myfile" );
8
ответ дан 5 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

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