Как сохранить файл в путь к классу
Как я могу сохранить / загрузить файл, который находится там, где мои занятия? У меня нет физического пути к этому местоположению раньше, и я хочу динамически найти этот файл.
спасибо
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");
это расширение ответа Петра:
если вы хотите, чтобы файл находился в том же пути к классам, что и текущий класс (пример: 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");