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

什么';在Java中,查找任意用户的主目录的最佳方法是什么?,java,Java,在类Unix系统上,如果给定任意用户(不一定是运行程序的用户)的用户名,找到其主目录的最佳方法是什么 我想做这样的事情: public void writeToHomeDirectory(String user){ File homeFolder = new File("~" + user); File f = new File(homeFolder, "A File"); //f.writeStuff() } 这不起作用,因为“~user”没有展开,因为这是一个sh

在类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?

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

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

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

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

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

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

很抱歉自己回答,但我在尝试正确使用该命令时遇到了很多麻烦,所以我将把它放在这里,以防其他人碰巧遇到与我完全相同的问题

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

是的,这似乎是一个很好的解决方案。我们不能在/home/directory中列出子目录并找出所有用户的主目录吗?如果用户没有存储在/home/?他们不在我们的公司网络上。Windows呢?我喜欢这个答案,但我担心它不适合我的目的-我们需要包括网络(LDAP)用户,这些用户没有在/etc/passwd中列出。我越来越倾向于使用像“echo~user”或“finger user”这样的shell命令。也许您可以改为查询LDAP?当然有可用于Java的LDAP库。不能保证该用户将是LDAP用户-只能保证它们可能是LDAP。还希望避免用户在不需要的情况下将LDAP设置放入应用程序。如果您有LDAP网络用户,您可以将他们的主目录放在您想要的任何NFS共享上,因此他们可能不在同一文件夹中。不过横向思维不错。