2

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

在 CI 中会使用umask系统调用的组合,但我认为我不能在 Java 中调用它而不求助于 JNI。还有另一种方法吗?

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

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

2 回答 2

2

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

于 2013-09-01T14:18:21.297 回答
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());

    }

}
于 2013-09-01T19:06:57.623 回答