Как сохранить файл в путь к классу

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

спасибо

Edit:

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

6 ответов


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


использовать ClassLoader#getResource() или getResourceAsStream() получить их как URL или InputStream из-за classpath.

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 С ним.

вопросы:


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

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

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

File file = new File(basePathOfClass, "filename.ext");

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


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

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

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

свойства записи в Classpath:

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

создайте объект File на Путь к классу:

private File createPropertiesFile(String relativeFilePath) throws URISyntaxException {
    return new File(new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()), relativeFilePath);
}

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

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