Hoe een relatief pad in Java te definiëren

Hier is de structuur van mijn project:

Ik moet config.propertiesin MyClass.javalezen.
Ik heb geprobeerd dit als volgt te doen met een relatief pad:

// Code called from MyClass.java
File f1 = new File("..\\..\\..\\config.properties");  
String path = f1.getPath(); 
prop.load(new FileInputStream(path));

Dit geeft me de volgende foutmelding:

..\..\..\config.properties (The system cannot find the file specified)

Hoe kan ik een relatief pad in Java definiëren? Ik gebruik jdk 1.6 en werk in Windows.


Antwoord 1, autoriteit 100%

Probeer zoiets als dit

String filePath = new File("").getAbsolutePath();
filePath.concat("path to the property file");

Dus uw nieuwe bestand verwijst naar het pad waar het is gemaakt, meestal uw thuismap van het project.

[EDIT]

Zoals @cmc al zei,

   String basePath = new File("").getAbsolutePath();
    System.out.println(basePath);
    String path = new File("src/main/resources/conf.properties")
                                                           .getAbsolutePath();
    System.out.println(path);

Beide geven dezelfde waarde.


Antwoord 2, autoriteit 6%

Bekijk eerst het verschil tussen het absolute pad en het relatieve pad hier:

Een absoluut pad bevat altijd het root-element en de volledige lijst met directory die vereist is om het bestand te vinden.

Als alternatief moet een relatief pad worden gecombineerd met een ander pad om toegang te krijgen tot een bestand.

In Constructor-bestand (String Pathname) zei Javadoc’s File Class dat

een padnaam, hetzij abstracte of in stringvorm, kan absoluut of familielid zijn.

Als u een relatief pad wilt krijgen, moet u het pad definiëren uit de huidige werkdirectory naar bestand of directory. Probeer het te gebruiken Systeemeigenschappen om dit te krijgen.As de afbeeldingen die u trok:

String localDir = System.getProperty("user.dir");
File file = new File(localDir + "\\config.properties");

Bovendien moet u proberen te vermijden om te gebruiken met vergelijkbare “.”, “../”, “/”, en andere vergelijkbaar ten opzichte van het bestandslocatie-relatieve pad, omdat wanneer bestanden worden verplaatst, is het moeilijker te hanteren.


Antwoord 3, Autoriteit 4%

File f1 = new File("..\\..\\..\\config.properties");  

Dit pad dat probeert toegang te krijgen tot het bestand is in projectdirectory, dan toegang tot het bestand als deze.

File f=new File("filename.txt");

Als uw bestand is in OtherSources/Resources

this.getClass().getClassLoader().getResource("relative path");//-> relative path from resources folder

Antwoord 4, Autoriteit 3%

Het is het vermelden waard dat in sommige gevallen

File myFolder = new File("directory"); 

verwijst niet naar de root-elementen. Als u uw toepassing bijvoorbeeld op de schijf C:(C:\myApp.jar) plaatst, verwijst myFoldernaar (windows)

C:\Users\USERNAME\directory

in plaats van

C:\Directory

Antwoord 5

public static void main(String[] args) {
        Properties prop = new Properties();
        InputStream input = null;
        try {
            File f=new File("config.properties");
            input = new FileInputStream(f.getPath());
            prop.load(input);
            System.out.println(prop.getProperty("name"));
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

U kunt ook
. gebruiken
Padpad1 =FileSystems.getDefault().getPath(System.getProperty(“user.home”), “downloads”, “somefile.txt”);


Antwoord 6

Ik had problemen met het toevoegen van screenshots aan ExtentReports met een relatief pad naar mijn afbeeldingsbestand. Mijn huidige map bij het uitvoeren is “C:\Eclipse 64-bit\eclipse\workspace\SeleniumPractic”. Hieronder heb ik de map ExtentReports gemaakt voor zowel de report.html als de image.png screenshot zoals hieronder.

private String className = getClass().getName();
private String outputFolder = "ExtentReports\\";
private String outputFile = className  + ".html";
ExtentReports report;
ExtentTest test;
@BeforeMethod
    //  initialise report variables
    report = new ExtentReports(outputFolder + outputFile);
    test = report.startTest(className);
    // more setup code
@Test
    // test method code with log statements
@AfterMethod
    // takeScreenShot returns the relative path and filename for the image
    String imgFilename = GenericMethods.takeScreenShot(driver,outputFolder);
    String imagePath = test.addScreenCapture(imgFilename);
    test.log(LogStatus.FAIL, "Added image to report", imagePath);

Hiermee worden het rapport en de afbeelding in de map ExtentReports gemaakt, maar wanneer het rapport wordt geopend en de (lege) afbeelding wordt geïnspecteerd, wordt met de muisaanwijzer over de afbeelding src weergegeven: “Kan de afbeelding niet laden” src=”.\ExtentReports\QXKmoVZMW7.png”.

Dit wordt opgelost door het relatieve pad en de bestandsnaam voor de afbeelding vooraf te laten gaan door de systeemeigenschap “user.dir”. Dit werkt dus perfect en de afbeelding verschijnt in het html-rapport.

Chris

String imgFilename = GenericMethods.takeScreenShot(driver,System.getProperty("user.dir") + "\\" + outputFolder);
String imagePath = test.addScreenCapture(imgFilename);
test.log(LogStatus.FAIL, "Added image to report", imagePath);

Antwoord 7

Voorbeeld voor Spring Boot. Mijn WSDL-bestand staat in Resources in de map “wsdl”. Het pad naar het WSDL-bestand is:

resources/wsdl/WebServiceFile.wsdl

Om het pad van een methode naar dit bestand te krijgen, kun je het volgende doen:

String pathToWsdl = this.getClass().getClassLoader().
                    getResource("wsdl\\WebServiceFile.wsdl").toString();

Other episodes