我正在学习如何独立访问java中的资源。所以我尝试了使用File
类的下面列出的不同方法。
System.out.println("File .: " + new File(".").getAbsolutePath());
System.out.println("File /: " + new File("/").getAbsolutePath());
System.out.println("File /.: " + new File("/.").getAbsolutePath());
System.out.println("File ./: " + new File("./").getAbsolutePath());
System.out.println("File ..: " + new File("..").getAbsolutePath());
System.out.println("File ../: " + new File("../").getAbsolutePath()); // why / not printed at the end?
System.out.println("File /..: " + new File("/..").getAbsolutePath());
System.out.println("File /../: " + new File("/../").getAbsolutePath()); // why / also not here
System.out.println("File //: " + new File("//").getAbsolutePath()); // why output is only \\ No path even
System.out.println("File ..//: " + new File("..//").getAbsolutePath()); // why not printed // at the end?
System.out.println("File //..//: " + new File("//..//").getAbsolutePath()); // why output \\.. only. No path even
输出如下所示。
File .: D:\8th Semester\Java\CMDProjects\ClassPathTest\out\.
File /: D:\
File /.: D:\.
File ./: D:\8th Semester\Java\CMDProjects\ClassPathTest\out\. // I'm expecting / at the end too.
File ..: D:\8th Semester\Java\CMDProjects\ClassPathTest\out\..
File ../: D:\8th Semester\Java\CMDProjects\ClassPathTest\out\.. // same above question
File /..: D:\..
File /../: D:\.. // same above question
File //: \\ // Here why D:\ path not printed?
File ..//: D:\8th Semester\Java\CMDProjects\ClassPathTest\out\..
File //..//: \\.. //strange same above.
然后我用class
的{{1}}方法尝试了同样的事情。它的工作方式与预期的相同,但在最后三行中我通过逐个检查找到了异常为什么?
getResource()
我想问为什么 URL dot = Test.class.getResource(".");
URL dotS = Test.class.getResource("./");
URL S = Test.class.getResource("/");
URL Sdot = Test.class.getResource("/.");
URL ddot = Test.class.getResource("..");
URL ddotS = Test.class.getResource("../");
URL sdd = Test.class.getResource("/..");
URL sdds = Test.class.getResource("/../");
URL ss = Test.class.getResource("//");
System.out.println("getR .: " + dot.toString());
System.out.println("getR /:" + S.toString());
System.out.println("getR /.:" + Sdot.toString());
System.out.println("getR ./:" + dotS.toString());
System.out.println("getR ..:" + ddot.toString());
System.out.println("getR ../:" + ddotS.toString());
// System.out.println("getR /..:" + sdd.toString()); // Exception Here
// System.out.println("getR /../:" + sdds.toString()); // Exception Here
// System.out.println("getR //:" + ss.toString()); // Exception Here
的方法getResource()抛出class
异常?为什么以上NullPointer
的输出不同?看到我写的顶级代码//为什么?
我正在使用Windows 10。
正如我已经提到的,我正在学习以不同方式访问资源。如果您有任何有用的链接,请分享。
答案 0 :(得分:2)
空指针异常是因为null
为最后三个路径字符串返回"/"
。只要找不到指定的资源,就会发生这种情况。出于安全原因,不允许Java代码访问(甚至不知道)类路径之外的资源。路径Test
映射到用于加载类D:\8th Semester\Java\CMDProjects\ClassPathTest
的类路径的根目录。它从您的输出中看出这是D:\8th Semester\Java\CMDProjects\ClassPathTest\out
(或可能是File#toString()
;您不会报告实验第二部分的输出。
至于为什么尾部斜杠从文件路径中消失,这是File#getPath()
应该如何工作的一部分。根据文档,File#toString()
返回与"//..//"
相同的字符串。 docs for that method反过来说:
结果字符串使用默认的名称 - 分隔符来分隔名称序列中的名称。
请注意,名称分隔符用于分隔名称。它不保留尾随分隔符(不分隔任何东西)。
我不确定为什么"\\.."
的绝对路径是"//.."
。 (或者,就此而言,为什么"\\"
会导致//
。很容易理解为什么尾随"/.."
被抑制;这些是名称分隔符,不会分隔任何内容。 Mac的两个输出都是"//"
。这种行为显然与操作系统有关。我怀疑在Windows上,前导 Axis G1 G2 G3 G4 G5
0 NaN ABC DEF GHI KLM NOP
1 QRS Y Y Y N N
2 TUV Y Y N N N
3 WXZ Y Y N N N
4 ZAB Y Y XX N Y
5 CDE Y Y N N Y
6 FGH Y Y Y N Y
代表计算机的网络路径,而计算机名称就不存在了。