带字符串变量的绝对路径

Absolute path with string variable

请帮助我理解这里发生了什么:

我的代码:

import java.io.File;

public class Main {

    public static void main(String[] args) {
        String name = "‪d:\downloads\testfile.mp3";

        File file1 = new File(name);
        System.out.println(file1.getAbsolutePath());

        File file = new File("d:\downloads\testfile.mp3");        
        System.out.println(file.getAbsolutePath());
    }
}

输出:

J:\Louw\Programming\PathTest\‪d:\downloads\testfile.mp3
d:\downloads\testfile.mp3

问题: 为什么 String 变量会产生与使用新文件对象直接键入字符串不同的绝对路径? (显然,如果稍后尝试使用,第一个输出也会抛出 "FileNotFound" 异常)。

我的Eclipsejava开发环境是:

面向 Web 开发人员的 Eclipse Java EE IDE。

版本:Neon.2 发布 (4.6.2) 构建 ID:20161208-0600

请协助。

您的代码没有问题,并且符合您的预期。它正在打印 ‪d:\downloads\testfile.mp3 两次。

您执行程序的方式可能是在 运行 您的程序之前打印 J:\Louw\Programming\PathTest\ 没有换行符到标准输出,或者您看到系统提示并将其解释为输出。

您的 name 字符串开头有一个奇怪的不可打印的 Unicode 字符。字符串的第二个实例看起来相同,但不包含该字符。将第二个字符串粘贴到第一个字符串的顶部,问题就会消失。

现在我不能100%确定这是否是正确的解释,但我相信它是一致的,所以我也相信它值得你检查。

当我将您的代码复制到我的 Eclipse 中时,您的字符串 name 以 Unicode 值为 8234(202A 十六进制)的字符开头。这个字符没有打印出来,所以两个字符串看起来一样,其实不然。提到的字符不是您在构造第二个 File 对象时传递的字符串。 fileformat.info上这个字符叫做“left-to-right embedding”,不知道什么意思

d:\ 前面的这样一个字符会导致 Java 不将该字符串识别为绝对路径名,因此将其视为相对路径名,相对于您的工作目录。

还有待确定该字符是否也在您的源文件中,或者只是悄悄出现在 Stack Overflow 或我的复制粘贴操作中。

如果 8234 确实是罪魁祸首:在我的 Eclipse 中,我可以像任何其他字符一样使用退格键删除它,一切都按预期进行。如果做不到这一点,您始终可以删除至少包含前面的 " 和后面的 d 的字符序列,然后再次键入它们。

那个字符可能来自哪里,我不知道。听起来您不太可能在不知情的情况下在键盘上键入 Alt-202A。