java - 在 Java 中加入路径

标签 java

Python 中,我可以使用 os.path.join 连接两条路径:

os.path.join("foo", "bar") # => "foo/bar"

我正在尝试在 Java 中实现相同的目标,而不用担心 OSUnixSolaris 还是 Windows:

public static void main(String[] args) {
    Path currentRelativePath = Paths.get("");
    String current_dir = currentRelativePath.toAbsolutePath().toString();
    String filename = "data/foo.txt";
    Path filepath = currentRelativePath.resolve(filename);

    // "data/foo.txt"
    System.out.println(filepath);

}

我期待 Path.resolve( ) 将加入我当前的目录 /home/user/testdata/foo.txt制作 /home/user/test/data/foo.txt。 我哪里错了?

最佳答案

即使使用 empty String 获取当前目录的原始解决方案有效。但推荐使用 user.dir 属性作为当前目录,user.home 作为主目录。

Path currentPath = Paths.get(System.getProperty("user.dir"));
Path filePath = Paths.get(currentPath.toString(), "data", "foo.txt");
System.out.println(filePath.toString());

输出:

/Users/user/coding/data/foo.txt

来自 Java Path类文档:

A Path is considered to be an empty path if it consists solely of one name element that is empty. Accessing a file using an empty path is equivalent to accessing the default directory of the file system.


为什么 Paths.get("").toAbsolutePath() 有效

当一个空字符串被传递给 Paths.get("") 时,返回的 Path 对象包含空路径。但是当我们调用 Path.toAbsolutePath() 时,它会检查路径长度是否大于零,否则它使用 user.dir 系统属性并返回当前路径。

这里是 Unix 文件系统实现的代码:UnixPath.toAbsolutePath()


基本上你需要在解析当前目录路径后再次创建 Path 实例。

我还建议将 File.separatorChar 用于平台无关代码。

Path currentRelativePath = Paths.get("");
Path currentDir = currentRelativePath.toAbsolutePath(); // <-- Get the Path and use resolve on it.
String filename = "data" + File.separatorChar + "foo.txt";
Path filepath = currentDir.resolve(filename);

// "data/foo.txt"
System.out.println(filepath);

输出:

/Users/user/coding/data/foo.txt

关于java - 在 Java 中加入路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34459486/

相关文章:

java - JDK 中的 KEYTOOL 是什么?开发人员如何使用它?

java - Java 应用程序中的计数排序和使用

java - JAXB、REST 将 XML 对象发送到远程 URL

java分割日期时间段并返回数组

java - 根级别的 Android 应用程序透明度和窗口大小

java - 返回多个 ArrayList<ArrayList<String>>

java - 如何在 JSF 项目中获取文件资源

java - 是否可以有 2 个文件替代 log4j,每次打开时使用?

java - 将 scala.Future 与 Java 8 lambda 一起使用

java - 为什么在 Android 上使用 Java FileOutputStream 创建的文件在几次 ubs 重新连接后通过 USB 在我的电脑上可见(+最多几分钟)