Как определить относительный путь в Java

Вот структура моего проекта:

here is the structure of my project

Мне нужно прочитать config.properties внутри MyClass.java. Я попытался сделать это с относительным путем следующим образом:

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

Это дает мне следующую ошибку:

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

Как я могу определить относительный путь в Java? Я использую JDK 1.6 и работаю на Windows.

Ответ 1

Попробуйте что-то вроде этого

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

Итак, ваш новый файл указывает на путь, в котором он создан, обычно в домашней папке вашего проекта.

[EDIT]

Как сказал @cmc,

    String basePath = new File("").getAbsolutePath();
    System.out.println(basePath);

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

Оба дают одинаковое значение.

Ответ 2

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

этот путь, пытающийся получить доступ к файлу, находится в каталоге Project, а затем просто получает доступ к этому файлу.

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

если ваш файл находится в OtherSources/Resources

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

Ответ 3

Во-первых, посмотрите на разницу между абсолютным и относительным путями здесь:

Абсолютный путь всегда содержит корневой элемент и полный список каталогов, необходимых для поиска файла.

Кроме того, относительный путь должен быть объединен с другим путем для доступа к файлу.

В конструкторе File (String pathname) класс Javadoc File сказал, что

Имя пути, будь то абстрактное или строковое, может быть абсолютным или относительным.

Если вы хотите получить относительный путь, вы должны определить путь от текущего рабочего каталога до файла или каталога. Попробуйте использовать системные свойства, чтобы получить это. Как изображения, которые вы нарисовали:

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

Более того, вам следует избегать использования аналогичных символов ".", "../", "/" и других аналогичных по отношению к относительному пути расположения файлов, поскольку при перемещении файлов их сложнее обрабатывать.

Ответ 4

Стоит отметить, что в некоторых случаях

File myFolder = new File("directory"); 

не указывает на корневые элементы. Например, когда вы размещаете приложение на диске C: (C:\myApp.jar), тогда myFolder указывает на (windows)

C:\Users\USERNAME\directory

вместо

C:\Directory

Ответ 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();
                }
            }
        }

    }

Вы также можете использовать Path path1 = FileSystems.getDefault(). getPath (System.getProperty( "user.home" ), "downloads", "somefile.txt" );

Ответ 6

У меня возникли проблемы с прикреплением скриншотов к ExtentReports с использованием относительного пути к моему файлу изображения. Мой текущий каталог при выполнении "C:\Eclipse 64-bit\eclipse\workspace\SeleniumPractic". При этом я создал папку ExtentReports для файла report.html и image.png, как показано ниже.

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);

Это создает отчет и изображение в папке ExtentReports, но когда отчет открывается и проверяется (пустое) изображение, наведите указатель мыши на изображение. src показывает "Не удалось загрузить изображение" src= ".\ExtentReports\QXKmoVZMW7. PNG".

Это решается путем префикса относительного пути и имени файла для изображения с помощью свойства System "user.dir". Таким образом, это работает отлично, и изображение появляется в отчете html.

Крис

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

Ответ 7

Пример для Spring Boot. Мой WSDL файл находится в разделе "Ресурсы" в папке "wsdl". Путь к WSDL файлу:

ресурсы /WSDL/WebServiceFile.wsdl

Чтобы получить путь от какого-либо метода к этому файлу, вы можете сделать следующее:

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

Ответ 8

Я не собираюсь отвечать на ваш вопрос напрямую, но хочу предложить вам использовать Maven Standard Layout.

Это стандарт Java для организации вашего кода для людей и инструментов сборки.

── maven-project
        ├───pom.xml
        └───src
            ├───main
            │   ├───java
            │   ├───resources
            └───test
                ├───java
                └───resources

https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html