windows - Forskellige streng for at få adgang til ressource i java

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg lærer, hvordan vi kan få adgang til ressourcer i java selvstændigt. Så jeg har forsøgt forskellige måder som nedenstående under anvendelse af File klasse.


    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


Output er angivet som nedenfor.


File .: D:8th SemesterJavaCMDProjectsClassPathTestout.
File /:  D:
File /.:  D:.
File ./:  D:8th SemesterJavaCMDProjectsClassPathTestout. // I'm expecting / at the end too.
File ..:  D:8th SemesterJavaCMDProjectsClassPathTestout..
File ../:  D:8th SemesterJavaCMDProjectsClassPathTestout.. // same above question
File /..:  D:..
File /../:  D:.. // same above question
File //:  \            // Here why D: path not printed?
File ..//:  D:8th SemesterJavaCMDProjectsClassPathTestout..  
File //..//:  \..        //strange same above.


Så forsøgte jeg samme ting med class s getResource() metode. Det virker som forventet, men i de sidste tre linjer fandt jeg undtagelse ved at tjekke en efter en Hvorfor?


    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


Jeg vil gerne spørge, hvorfor class s metode getResource () kaster NullPointer undtagelse? Og hvorfor ovenstående File s output er anderledes? se topkoden, hvor jeg skrev//hvorfor?


Jeg bruger Windows 10.


Som jeg allerede nævnte, lærer jeg ressourceadgang på forskellige måder. Så hvis du har nyttige links, kan du også dele det også.

Bedste reference


Nulstillingsindstillingen er, fordi Test.class.getResource() vender tilbage null for de sidste tre strenge. Dette sker, når den angivne ressource ikke kunne findes. Af sikkerhedsgrunde er det ikke tilladt at få adgang til (eller endda vide) ressourcer uden for klassebanen. Banen "/" kortlægges til rodmappen i den klassebane, der bruges til at indlæse klassen Test. Det ser ud fra din produktion, at dette er D:8th SemesterJavaCMDProjectsClassPathTest (eller muligvis D:8th SemesterJavaCMDProjectsClassPathTestout, du rapporterer ikke output fra anden del af dit eksperiment).


Hvad angår hvorfor forsinket skråstreg forsvinder fra dine filstier, er den del af hvordan File#toString() skal fungere. Ifølge docs returnerer File#toString() den samme streng som File#getPath(). docs for denne metode siger i sin tur: [26] [27]



  Den resulterende streng bruger standardnavn-separator-tegn til at adskille navnene i navnesekvensen.



Bemærk, at navnet separator tegn bruges til adskille navnene. Det bevarer ikke efterfølgende separatorer (der adskiller ikke noget).


Jeg er ikke sikker på, hvorfor den absolutte vej til "//..//" er "\..". (Eller for den sags skyld, hvorfor "//.." resulterer i "\". Det er let at forstå hvorfor den efterfølgende // er undertrykt, det er navnet separator tegn, der ikke adskiller noget. På min Mac er output for begge disse "/..". Denne adfærd er naturligvis OS-afhængig. Windows, den førende "//" repræsenterer en netværkssti til en computer, og computernavnet er bare fraværende.