Я использовал класс ResorceLoder для получения потока ввода, но как я могу получить outputStream, это возможно изменить данные, находящиеся в этом пакете? (мне нужно изменить файлы изображений, которые присутствуют в этом пакете, используя класс java, который присутствует в том же файле jar)Как я могу изменить данные файла, который присутствует в этом пакете? (В java, как получить outputStream этого файла?)
ответ
Вы не можете напрямую изменить ресурсы своей jar- файл во время выполнения. КлассLoader (который предоставляет вам те InputStreams, не предоставляет OutputStream для перезаписи файлов в jar-файле).
Если вы хотите манипулировать изображениями или ресурсами, подобными этому во время выполнения, не помещайте их в свой файл jar, а извлекайте их из файловой системы.
+1 банки предназначены для ресурсов, которые не меняются. –
благодарю вас за ваш ответ, у вас есть идея, как мы можем дать путь абзаца для файла synth xml (изменить внешний вид)? – user2763652
@ user2763652 Посмотрите здесь, есть также пример того, как установить L & F http://en.wikipedia.org/wiki/Synth_Look_and_Feel – Matthias
Изменение ресурсов класса пути является трудным или невозможным ... в зависимости от класса loader и classpath.
Если ресурс classpath находится в каталоге файловой системы, вы должны быть в состоянии его заменить. Однако возможно, что файл заблокирован, и нет гарантии, что обновленный ресурс будет виден до перезапуска JVM.
Если путь к классам ресурса в JAR или ZIP в локальной файловой системе, у вас есть несколько дополнительных проблем:
Вы не можете сделать обновление на месте баночки или ZIP-файл. Вам нужно будет создать новый ZIP/JAR и скопировать на него существующий контент.
Файл ZIP или JAR на пути к классам будет заблокирован..
Если ресурс пути к классам в ZIP или JAR, который был загружен, это не будет возможно (в целом), чтобы обновить файл на источнике ... так что ваши изменения не могут «кнут».
Если вы используете специальный загрузчик классов, все ставки выключены ...
Короче говоря, лучше найти другой способ сделать это; например скопируйте/установите ресурсы в записываемый каталог в файловой системе и получите доступ к ним оттуда.
Хорошо. Если я правильно понял ваш вопрос, вы хотите изменить ресурс в пути класса через файл программы, расположенный в том же месте. Я думаю, это не должно быть проблемой, если вы понимаете под ограничение:
Загрузчик классов никогда не даст вам ручку ресурса (находится внутри баночки) в виде файла с пути каталога и все. Это потому, что Jar обычно не взорвался. Вы должны иметь свою банку в разобранном виде, чтобы получить ресурс как файл.
Когда вы запускаете свою программу, ваш текущий рабочий каталог может не быть местоположением ресурса/jar в пути к классам.
Вам необходимо выяснить каталог ресурса, а затем вы можете легко изменить или сделать то, что хотите.
Один из способов сделать это - указать путь к ресурсу где-нибудь в настраиваемом файле. это очень простой подход.
Другой способ - выяснить путь, используя логику. Одним из таких примеров взяты из this link
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. }
Я думаю, ваш вопрос очень абстрактно. Можете ли вы сделать это яснее? Может быть, фрагмент фрагмента кода даст больше контекста вашему вопросу? – thotheolh
, если вам действительно необходимо изменить свою собственную банку, вы можете попробовать [http://stackoverflow.com/questions/2463785/modify-executing-jar-file] –