я использовал класс ResorceLoder для получения входного потока, но как я могу получить outputStream, возможно ли изменить данные, которые находятся в этом пакете? (мне нужно изменить файлы изображений, которые присутствуют в этом пакете, используя класс java, который присутствует в тот же jar-файл)
как я могу изменить данные файла, который присутствует в этом пакете? (в java, как получить outputStream этого файла?)
Ответы (3)
Вы не можете напрямую изменить ресурсы вашего jar-файла во время выполнения. ClassLoader (который дает вам эти InputStreams, не предоставляет OutputStream для перезаписи файлов в jar-файле).
Если вы хотите манипулировать подобными изображениями или ресурсами во время выполнения, не помещайте их в свой файл jar, а извлекайте их из файловой системы.
Изменение ресурсов пути к классам либо сложно, либо невозможно... в зависимости от загрузчика классов и пути к классам.
Если ресурс пути к классам находится в каталоге файловой системы, вы сможете заменить его. Однако возможно, что файл заблокирован, и нет гарантии, что обновленный ресурс будет виден, пока вы не перезапустите JVM.
Если ресурс classpath находится в JAR или ZIP в локальной файловой системе, у вас есть пара дополнительных проблем:
Вы не можете выполнить обновление на месте файла JAR или ZIP. Вам нужно будет создать новый ZIP/JAR и скопировать в него существующий контент.
Файл ZIP или JAR в пути к классам будет заблокирован.
Если ресурс classpath находится в ZIP или JAR, который был загружен, будет невозможно (в общем) обновить файл в источнике... поэтому ваши изменения могут не «прилипнуть».
Если вы используете пользовательский загрузчик классов, все ставки отключены...
Короче говоря, лучше найти другой способ сделать это; например скопируйте/установите ресурсы в доступный для записи каталог в файловой системе и получите к ним доступ оттуда.
Хорошо.. Если я правильно понял ваш вопрос, вы хотите изменить ресурс в пути к классу через программный файл, расположенный в том же месте. Я думаю, это не должно быть проблемой, если вы понимаете следующие ограничения:
Classloader никогда не даст вам дескриптор ресурса (находящегося внутри jar) в виде файла с путем к каталогу и всем остальным. Это потому, что Jar обычно не взрывается. Вам нужно, чтобы ваша банка была в разобранном виде, чтобы получить ресурс в виде файла.
Когда вы запускаете свою программу, ваш текущий рабочий каталог может не совпадать с ресурсом/jar в пути к классам.
Вам нужно выяснить каталог ресурса, а затем вы можете легко изменить или сделать то, что хотите.
Один из способов сделать это — объявить путь к вашему ресурсу где-нибудь в настраиваемом файле. это очень простой подход.
Другой способ - выяснить путь, используя логику. Один из таких примеров взят из эта ссылка
try { //Attempt to get the path of the actual JAR file, because the working directory is frequently not where the file is. //Example: file:/D:/all/Java/TitanWaterworks/TitanWaterworks-en.jar!/TitanWaterworks.class //Another example: /D:/all/Java/TitanWaterworks/TitanWaterworks.class PROGRAM_DIRECTORY = getClass().getClassLoader().getResource("TitanWaterworks.class").getPath(); // Gets the path of the class or jar. //Find the last ! and cut it off at that location. If this isn't being run from a jar, there is no !, so it'll cause an exception, which is fine. try { PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(0, PROGRAM_DIRECTORY.lastIndexOf('!')); } catch (Exception e) { } //Find the last / and cut it off at that location. PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(0, PROGRAM_DIRECTORY.lastIndexOf('/') + 1); //If it starts with /, cut it off. if (PROGRAM_DIRECTORY.startsWith("/")) PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(1, PROGRAM_DIRECTORY.length()); //If it starts with file:/, cut that off, too. if (PROGRAM_DIRECTORY.startsWith("file:/")) PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(6, PROGRAM_DIRECTORY.length()); } catch (Exception e) { PROGRAM_DIRECTORY = ""; //Current working directory instead. }