【问题标题】:java.io.File(parent, child) does not work as expectedjava.io.File(parent, child) 没有按预期工作
【发布时间】:2011-09-01 11:34:51
【问题描述】:

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

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

这让我觉得如果我有以下代码:

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?

【问题讨论】:

  • 子路径名必须是相对路径名。我认为,转换讨论的是斜杠与反斜杠。在您的情况下,您必须在继续之前确定路径是否是绝对路径。
  • 如果您使用(更正确的)"C:\\Temp""C:\\Temp\\file.txt" 而不是使用前向冲突,行为是否相同?我目前没有安装 JDK 的 Windows PC,所以我无法对此进行测试。另外:new File("C:/Temp").isAbsolute() 打印什么?
  • @Joachim:"C:/Temp""C:\\Temp" 的处理方式相同。 new File("C:/Temp").isAbsolute() 打印 true.
  • @Joachim - isAbsolute 对所有四个路径都返回 true - 无论使用哪个斜线
  • 我在测试中发现如果你执行new File("directory", "/file") 和`new File("directory", "file"),它们都会产生绝对路径"directory/file"。第一个不会导致“目录//文件”。

标签: java file io


【解决方案1】:

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

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

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

是的,我相信是的。

这可能很容易做到

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

检查它是否是parent中目录的绝对路径,并且

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

获取相关部分。

【讨论】:

  • 嗯,当您说绝对路径被视为相对路径时,您可能是对的(它肯定是它的样子)。那将是一种耻辱(以及可怜的 JavaDoc 恕我直言 ;-))。我会稍微考虑一下你的建议,看看什么对我有用,谢谢!
【解决方案2】:

将您的基本目录表示为Path,例如

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

您可以使用Path.resolve 来确定您的fileNamePath(或File),无论它是绝对的还是相对的:

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

这里的额外normalize 只是负责清理路径中的任何...

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 2013-09-30
    • 2011-05-29
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2020-03-18
    相关资源
    最近更新 更多