2013-09-01 2 views
2

Я запускаю java 7 приложений на Unix-машинах. Есть ли способ получить текущее значение umask в чистой java?Как получить текущее значение umask с Java?

В C Я бы использовал комбинацию системных вызовов umask, но я не думаю, что могу назвать это на Java, не прибегая к JNI. Есть ли другой подход?

Edit: Вот пример C (от GUN LibC Docs):

 mode_t 
     read_umask (void) 
     { 
     mode_t mask = umask (0); 
     umask (mask); 
     return mask; 
     } 
+5

Java - это независимый от платформы язык, поэтому что такое umask на окнах? – StarPinkER

+0

Посмотрите на пакет [java.nio.file.attribute] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/package-summary.html). – McDowell

+0

@StarPinkER В java 7 nio вы найдете множество необязательных операций, которые реализованы только на определенных платформах (например, 'PosixFileAttribute'). – paradigmatic

ответ

2

Простое решение, если нет класса/метод, чтобы получить биты полномочий, почему вы не получите перед вызовом java и передать как свойство?

+0

Какой класс/метод? – paradigmatic

+0

Это интересное решение. Если я вызову java через скрипт, я могу передать его как переменную env. Решение, предоставленное @ortang, было бы тогда хорошим резервом. – paradigmatic

1

Можете уточнить? Вы хотите прочитать umask приложения (текущий Java-процесс)? Или вы хотите прочитать значение umask некоторых файлов в файловой системе?

Вы можете использовать NIO (используемый код из javadocs), чтобы получить некоторые атрибуты файла, или вы можете выполнить команду оболочки, поскольку процесс, созданный с помощью Runtime.execute, наследует umask его процесса-создателя.

Таким образом, вы сможете решить вашу проблему без использования JNI.

package test; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.nio.file.attribute.PosixFileAttributeView; 
import java.nio.file.attribute.PosixFileAttributes; 
import java.nio.file.attribute.PosixFilePermissions; 

public class Test { 

    private static final String COMMAND = "/bin/bash -c umask -S"; 


    public static String getUmask() { 
     final Runtime runtime = Runtime.getRuntime(); 
     Process process = null; 
     try { 
      process = runtime.exec(COMMAND); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      String umask = reader.readLine(); 
      if (process.waitFor() == 0) 
       return umask; 
     } catch (final IOException e) { 
      e.printStackTrace(); 
     } catch (final InterruptedException e) { 
      e.printStackTrace(); 
      Thread.currentThread().interrupt(); 
     } 
     return ""; 
    } 

    public static void main(String[] args) throws IOException { 
     /* 
     * NIO 
     */ 
     PosixFileAttributes attrs = Files.getFileAttributeView(Paths.get("testFile"), PosixFileAttributeView.class) 
       .readAttributes(); 
     System.out.format("%s %s%n", attrs.owner().getName(), PosixFilePermissions.toString(attrs.permissions())); 

     /* 
     * execute shell command to get umask of current process 
     */ 
     System.out.println(getUmask()); 

    } 

} 
+2

Файлы не имеют umasks. У них есть наборы разрешений, которые * являются результатом * umask в действии, когда они были созданы, и, возможно, были изменены с тех пор. Они не являются umask, и они не свидетельствуют о том, что было создано umask. – EJP

+0

Да, меня интересует процесс umask не в разрешениях posix файла. – paradigmatic

Смежные вопросы