【问题标题】:How to get the current umask value from Java?如何从 Java 中获取当前的 umask 值?
【发布时间】:2013-09-04 17:22:29
【问题描述】:

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

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

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

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

【问题讨论】:

  • Java是独立于平台的语言,那么windows上的umask是什么?
  • @StarPinkER 在 java 7 nio 中,你会发现很多只在某些平台上实现的可选操作(例如PosixFileAttribute)。
  • @McDowell 我在那里什么也没找到...
  • @paradigmatic - 您想要当前 Java 进程的掩码吗? JNA 是否支持您所有的目标平台?一个 C 的例子可以说明你想要什么。

标签: java java-7 umask


【解决方案1】:

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

【讨论】:

  • 这是一个有趣的解决方案。如果我通过脚本调用 java,我可以将它作为环境变量传递。 @ortang 提供的解决方案将是一个不错的后备方案。
【解决方案2】:

你能澄清一下吗?是否要读取应用程序的 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());

    }

}

【讨论】:

  • 文件没有 umasks。它们具有权限集,这些权限集源自创建它们时生效的 umask,并且此后可能已被修改。它们不是 umask,也不是创建时 umask 的证据。
  • 是的,我对进程 umask 感兴趣,而不是文件的 posix 权限。
猜你喜欢
  • 1970-01-01
  • 2020-06-13
  • 2018-09-10
  • 1970-01-01
  • 2017-08-03
  • 2019-09-08
  • 2011-09-02
  • 1970-01-01
  • 2011-01-26
相关资源
最近更新 更多