请帮助我理解这里发生了什么:
我的代码:
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
请协助。
答案 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而不知道你是这样做的。