带字符串变量的绝对路径
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。
请帮助我理解这里发生了什么:
我的代码:
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。