代码之家  ›  专栏  ›  技术社区  ›  Scott

在Java中找到任意用户的主目录的最好方法是什么?

  •  0
  • Scott  · 技术社区  · 14 年前

    在类似Unix的系统上,如果给定用户的用户名,查找任意用户(不一定是运行程序的用户)的主目录的最佳方法是什么?

    我想做这样的事情:

    public void writeToHomeDirectory(String user){
        File homeFolder = new File("~" + user);
    
        File f = new File(homeFolder, "A File");
        //f.writeStuff()
    }
    

    这不起作用,因为“~user”不会展开,因为这是一个shell功能。在Java中有什么方法可以做到这一点,还是唯一的方法是用运行时执行shell?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Stephen C    14 年前

    在Java中没有简单的方法来实现这一点。但是,您可以通过读取“/etc/passwd”文件,查找 user 并提取用户的主目录。基本上这就是壳牌公司所做的……

        2
  •  1
  •   Scott    14 年前

    不好意思自己回答,但我有很多麻烦,特别是要得到正确的命令,所以我会把这个放在这里,以防其他人恰好有与我相同的问题。

    private File getHomeDirectoryOf(String username) throws IOException, Exception{
        String[] command = new String[]{"/bin/sh", "-c", "echo ~"+username + ""};
        Process echo = Runtime.getRuntime().exec(command);
        BufferedReader br = new BufferedReader(new InputStreamReader(echo.getInputStream()));
    
        try{
            echo.waitFor();
        }
        catch(InterruptedException e){
    
        }
    
        String path = br.readLine();
        echo.destroy();
    
        if(path.contains("~")){
            System.out.println("Home directory for " + username + " cannot be found.");
            throw new Exception();
        }
        else{
            return new File(path);
        }
    }
    

    这只对我的特定问题是必要的-如果您只需要本地用户或LDAP用户,其他的答案提供了更好的方法。

        3
  •  0
  •   Noel M    14 年前

    我想,如果没有正确的权限,系统中所有用户的信息将很难获得。

    因为它依赖于操作系统,所以可以使用该属性 user.home 然后从属性中替换用户名 user.name 使用传递给方法的用户字符串:

        String user = "..."; // found elsewhere
        String home = System.getProperty("user.home");
        String newUserHome = home.replace(System.getProperty("user.name"), user);
    

    这至少保持了当前操作系统中用户主目录位置的约定,用户主目录可能是定制的。如果用户的主目录不在一个一致的位置(我无法想象是这样),那么所有的赌注都是在IMO上。

        4
  •  0
  •   user207421    14 年前

    您可以执行'sh'让它评估~。但这是一个奇怪的要求。很可能你对它没有写访问权,甚至可能没有读访问权。