Создать файл объекта файла из родительского каталога в Java - PullRequest
0 голосов
/ 11 марта 2011


У меня проблема с доступом к файлу в одном из родительских каталогов.
Для объяснения рассмотрим следующую структуру dir: -

C:/Workspace/Appl/src/org/abc/bm/TestFile.xml  
C:/Workspace/Appl/src/org/abc/bm/tests/CheckTest.java

В CheckTest.java я хочу создать экземпляр файла для TestFile.xml

public class Check {
    public void checkMethod() {
        File f = new File({filePath value I want to determine}, "TestFile.xml");
    }
}

Я попробовал несколько вещей с getAbsolutePath() и getParent() и т. Д., Но мне стало немного сложнее и, честно говоря, я думаю, что все испортил.
Причина, по которой я не хочу использовать "C:/Workspace/Appl/src/org/abc/bm" при создании экземпляра File, заключается в том, что C:/Workspace/Appl не является фиксированным и во всех обстоятельствах будет отличаться во время выполнения, и в основном я не хочу жестко кодировать.
Что может быть самым простым и чистым способом добиться этого?

Спасибо.

Ответы [ 6 ]

3 голосов
/ 11 марта 2011

В этом случае вы должны загрузить его из Classpath.

В вашем CheckTest.java попробуйте

FileInputStream fileIs = new FileInputStream(CheckTest.class.getClassLoader().getResourceAsStream("org/abc/bm/TestFile.xml");
1 голос
/ 11 марта 2011

Что может быть самым простым и чистым способом для достижения этой цели?

Для доступа к статическим ресурсам используйте:

URL urlToResource = this.getClasS().getResource("path/to/the.resource");

Если ожидается изменение ресурса, запишите его в подкаталог user.home, где его легко найти позже.

1 голос
/ 11 марта 2011

Используйте System.getProperty, чтобы получить базовый каталог, или вы установили base.dir во время запуска приложения

java -Dbase.dir=c:\User\pkg 

System.getProperty("base.dir");

и используйте

System.getProperty("file.separator");
0 голосов
/ 11 марта 2011

Можно сделать это:

String pathOfTheCurrentClass = this.getClass().getResource(".").getPath();        
File file = new File(pathOfTheCurrentClass + "/..", "Testfile.xml");

или

String pathOfTheCurrentClass = this.getClass().getResource(".").getPath();
File filePath = new File(pathOfTheCurrentClass);
File file = new File(filePath.getParent(), "Testfile.xml");

Но, как указывает Томас Нарос, это дает вам файл, расположенный в пути сборки.

0 голосов
/ 11 марта 2011

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

Но вы можете получить доступ к ресурсам, включенным в ваш classpath (там, где вы скомпилировали файлы .class).

Обычно ваш компилятор копирует XML-файл, включенный в ваш каталог srouce, вкаталог сборки, так что, наконец, у вас может получиться что-то вроде этого:

C:/Workspace/Appl/classes/org/abc/bm/TestFile.xml  
C:/Workspace/Appl/classes/org/abc/bm/tests/CheckTest.class

Затем, когда ваш путь к классу указывает на корневой каталог скомпилированных классов, вы получаете ресурсы из этого каталога, используя ClassLoader.getResource метод (или эквивалентный Class.getResource () метод).

public class Check {
    public void checkMethod() {
        java.net.URL fileURL=this.getClass().getResource("/org/abc/bm/tests/TestFile.xml");

        File f=new File( fileURL.toURI());

    }
}
0 голосов
/ 11 марта 2011

Вы пробовали

URL some=Test.class.getClass().getClassLoader().getResource("org/abc/bm/TestFile.xml");
File file = new File(some.getFile());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...