如何从Java获取当前的umask值?

时间:2013-09-01 13:43:03

标签: java java-7 umask

我在unix机器上运行java 7应用程序。有没有办法在纯java中获取当前的umask值?

在C中,我会使用umask系统调用的组合,但我不认为我可以在不使用JNI的情况下在Java中调用它。还有另一种方法吗?

编辑:这是一个C示例(来自GUN libc文档):

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

2 个答案:

答案 0 :(得分:2)

一个简单的解决方案,如果没有类/方法来获取umask,为什么不在调用java之前获取它并作为属性传递?

答案 1 :(得分:1)

你能澄清一下吗?您想阅读应用程序的umask(当前的java进程)吗?或者您想读取文件系统上某些文件的umask值吗?

您可以使用NIO(使用的代码来自javadocs)来获取某些文件属性,或者您可以执行shell命令,因为使用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());

    }

}