Как я могу сохранить файл в путь к классу - PullRequest
14 голосов
/ 17 января 2011

Как я могу сохранить / загрузить файл, который находится там, где находятся мои классы? У меня нет физического пути к этому местоположению раньше, и я хочу динамически найти этот файл.

Спасибо

Edit:

Я хочу загрузить файл XML, записать и прочитать его, и я не уверен, как к нему обратиться.

Ответы [ 6 ]

36 голосов
/ 17 января 2011

Используйте ClassLoader#getResource() или getResourceAsStream(), чтобы получить их как URL или InputStream из пути к классам.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/file.ext");
// ...

Или, если он находится в том же пакете, что и текущий класс, вы также можете получить его следующим образом:

InputStream input = getClass().getResourceAsStream("file.ext");
// ...

Сохранение - это отдельная история. Это не будет работать, если файл находится в файле JAR. Если вы можете быть уверены, что файл расширен и доступен для записи, преобразуйте URL из getResource() в File.

URL url = classLoader.getResource("com/example/file.ext");
File file = new File(url.toURI().getPath());
// ...

Затем вы можете построить FileOutputStream.

Похожие вопросы:

12 голосов
/ 17 января 2011

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

String basePathOfClass = getClass()
   .getProtectionDomain().getCodeSource().getLocation().getFile();

Чтобы получить файл по этому пути, вы можете использовать

File file = new File(basePathOfClass, "filename.ext");
8 голосов
/ 17 января 2011

new File(".").getAbsolutePath() + "relative/path/to/your/files";

6 голосов
/ 17 января 2011

В общем случае вы не можете. Ресурсы, загружаемые из загрузчика классов, могут быть любыми: файлы в каталогах, файлы, встроенные в файлы JAR или даже загруженные по сети.

4 голосов
/ 12 января 2017

Это расширение ответа Питера:

Если вы хотите, чтобы файл находился в том же пути к классам, что и текущий класс (Пример: проект / классы):

URI uri = this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI();
File file = new File(new File(uri), PROPERTIES_FILE);
FileOutputStream out = new FileOutputStream(createPropertiesFile(PROPERTIES_FILE));
prop.store(out, null);

Если вы хотитефайл в другом пути к классам (Пример: progect / test-classes), просто замените this.getClass() на что-то вроде TestClass.class.

Чтение свойств из Classpath:

Properties prop = new Properties();

System.out.println("Resource: " + getClass().getClassLoader().getResource(PROPERTIES_FILE));
InputStream in = getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILE);
if (in != null) {
    try {
        prop.load(in);
    } finally {
        in.close();
    }
}

Запись свойствв путь к классам:

Properties prop = new Properties();
prop.setProperty("Prop1", "a");
prop.setProperty("Prop2", "3");
prop.setProperty("Prop3", String.valueOf(false));

FileOutputStream out = null;
try {
    System.out.println("Resource: " + createPropertiesFile(PROPERTIES_FILE));
    out = new FileOutputStream(createPropertiesFile(PROPERTIES_FILE));
    prop.store(out, null);
} finally {
    if (out != null) out.close();
}

Создание объекта файла на пути к классам:

private File createPropertiesFile(String relativeFilePath) throws URISyntaxException {
    return new File(new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()), relativeFilePath);
}
1 голос
/ 17 января 2011

В соответствии с документацией о системных свойствах , вы можете получить доступ к ней как свойство "java.class.path":

string classPath = System.getProperty("java.class.path");
...