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

时间:2010-08-02 09:48:34

标签: java

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

我希望做这样的事情:

public void writeToHomeDirectory(String user){
    File homeFolder = new File("~" + user);

    File f = new File(homeFolder, "A File");
    //f.writeStuff()
}

这不起作用,因为'〜user'没有扩展,因为这是一个shell功能。有没有办法在Java中执行此操作,或者是使用Runtime.exec()运行shell的唯一方法?

4 个答案:

答案 0 :(得分:1)

在Java中没有简单的方法可以做到这一点。但是你可以通过阅读“/ etc / passwd”文件来查找user的条目并解压缩用户的主目录。这基本上就是shell的作用......

答案 1 :(得分:1)

很抱歉自我回答,但我有很多人都在努力试图让命令特别正确,所以我会把它放在这里以防万一其他人碰巧和我有完全相同的问题。

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用户,其他答案可以提供更好的方法。

答案 2 :(得分:0)

我想如果没有合适的权限,很难获得有关系统中所有用户的信息。

由于它依赖于操作系统,您可以使用属性user.home,然后使用您传递给方法的用户String替换属性user.name中的用户名:

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

这至少保留了当前操作系统对用户主目录的位置的约定,这可能是自定义的。如果用户主目录不在一致的位置(我无法想象那种情况),那么所有的赌注都不在IMO。

答案 3 :(得分:0)

你可以执行'sh'来评估〜。但这是一个奇怪的要求。可能的情况是你无论如何都不会有写入权限,甚至可能都没有读取权限。