在java中访问资源的不同字符串

时间:2018-02-16 19:17:19

标签: java windows

我正在学习如何独立访问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。

正如我已经提到的,我正在学习以不同方式访问资源。如果您有任何有用的链接,请分享。

1 个答案:

答案 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 代表计算机的网络路径,而计算机名称就不存在了。