字符串变量

时间:2017-02-26 06:42:38

标签: java filenotfoundexception absolute-path

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

我的代码:

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变量会产生与使用新File对象直接键入字符串不同的绝对路径? (显然,如果稍后尝试使用,第一个输出也会抛出" FileNotFound"异常)。

我的Eclipse java开发环境是:

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

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

请协助。

3 个答案:

答案 0 :(得分:1)

您的代码很好,正在按照您的期望行事。它打印‪d:\downloads\testfile.mp3两次。

在运行程序之前,执行程序的任何内容都是打印J:\Louw\Programming\PathTest\而没有新行添加到stdout,或者您正在查看系统提示并将其解释为输出。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

当我将代码复制到Eclipse中时,字符串name以Unicode值8234(202A十六进制)的字符开头。此字符未打印,因此两个字符串看起来相同,但它们不是。提到的字符不是构造第二个File对象时传递的字符串。在fileformat.info上,角色被称为“从左到右嵌入”,我不知道这意味着什么。

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

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

如果8234确实是罪魁祸首:在我的Eclipse中,我可以使用退格键将其删除为任何其他角色,并且一切都按预期工作。如果不这样做,您可以随时删除至少包含"之前和d之后的字符序列,然后再次输入。

这个字母可能来自哪里,我不知道。你不太可能在键盘上键入Alt-202A而不知道你是这样做的。