Ответ 1
В общем случае вы не можете. Ресурсы, загруженные из загрузчика классов, могут быть любыми: файлы в каталогах, файлы, встроенные в файлы jar или даже загруженные по сети.
Как сохранить/загрузить файл, который находится там, где мои классы? Я до сих пор не физический путь к этому местоположению, и я хочу динамически найти этот файл.
Спасибо
Edit:
Я хочу загрузить XML файл и написать и прочитать его, и я не уверен, как его решить.
В общем случае вы не можете. Ресурсы, загруженные из загрузчика классов, могут быть любыми: файлы в каталогах, файлы, встроенные в файлы jar или даже загруженные по сети.
Используйте 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
.
Вы можете попробовать следующее, если ваш класс загружен из файловой системы.
String basePathOfClass = getClass()
.getProtectionDomain().getCodeSource().getLocation().getFile();
Чтобы получить файл на этом пути, вы можете использовать
File file = new File(basePathOfClass, "filename.ext");
new File(".").getAbsolutePath() + "relative/path/to/your/files";
В соответствии с документацией по свойствам системы вы можете получить доступ к этому как свойство "java.class.path":
string classPath = System.getProperty("java.class.path");
Это разложение на ответ Питера:
Если вы хотите, чтобы файл находился в том же пути класса, что и текущий класс (пример: 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
.
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);
}