java.io.File(父级、子级)无法按预期工作

2022-09-04 22:36:26

我正在尝试基于用户提供的文件名(可以是绝对的或相对的)和依赖于环境的基目录来构造Java File对象。java.io.File(File parent, String child)的java doc说如下:

如果子路径名字符串是绝对的,则以与系统相关的方式将其转换为相对路径名

这让我想到,如果我有以下代码:

public class TestClass {
    public static void main(String[] args) throws IOException {
        File file = new File(new File("C:/Temp"),"C:/Temp/file.txt");
        System.out.println(file.getAbsolutePath());
    }
}

输出将为

C:\Temp\file.txt

然后我会做生意,因为如果用户提供绝对或相对路径,那将不再重要。但实际上,输出是

C:\Temp\C:\Temp\file.txt

这意味着我必须弄清楚确切的相对路径(或者至少测试不同的选项以查看文件是否存在)。我是否误解了 JavaDoc?


答案 1

如果子路径名字符串是绝对的,则以与系统相关的方式将其转换为相对路径名。

我认为这意味着即使您提供了绝对路径,它也将被转换为(以系统依赖的方式),并被视为相对路径。

这意味着我必须弄清楚确切的相对路径(或者至少测试不同的选项以查看文件是否存在)。

是的,我相信是的。

这也许可以很容易地完成

file.getAbsolutePath().startsWith(parent.getAbsolutePath());

以检查它是否是 中某个目录的绝对路径,以及parent

file.getAbsolutePath().substring(parent.getAbsolutePath().length());

以获取相对部分。


答案 2

将基目录表示为 ,例如Path

Path basePath = new File("C:/Temp").toPath();

您可以使用 来确定 (or) 的 ,无论它是绝对的还是相对的:Path.resolvePathFilefileName

Path path = basePath.resolve(fileName).normalize();
File file = path.toFile();

此处的附加项仅负责清理任何或从路径中清理。normalize...