как я могу изменить данные файла, который присутствует в этом пакете? (в java, как получить outputStream этого файла?)

я использовал класс ResorceLoder для получения входного потока, но как я могу получить outputStream, возможно ли изменить данные, которые находятся в этом пакете? (мне нужно изменить файлы изображений, которые присутствуют в этом пакете, используя класс java, который присутствует в тот же jar-файл)


person user2763652    schedule 10.09.2013    source источник
comment
Я думаю, что ваш вопрос очень абстрактный. Можете ли вы сделать это более ясным? Может быть, фрагмент кода примера даст больше контекста для вашего вопроса?   -  person thotheolh    schedule 10.09.2013
comment
если действительно необходимо изменить свою собственную банку, вы можете попробовать [stackoverflow.com/questions/2463785/modify-executing-jar-file]   -  person Frank M.    schedule 10.09.2013


Ответы (3)


Вы не можете напрямую изменить ресурсы вашего jar-файла во время выполнения. ClassLoader (который дает вам эти InputStreams, не предоставляет OutputStream для перезаписи файлов в jar-файле).

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

person Matthias    schedule 10.09.2013
comment
спасибо за ваш ответ, у вас есть идеи, как мы можем указать абсолютный путь для файла synth xml (чтобы изменить внешний вид)? - person user2763652; 10.09.2013
comment
@ user2763652 Посмотрите здесь, здесь также есть пример того, как установить L&F en.wikipedia.org/ wiki/Synth_Look_and_Feel - person Matthias; 10.09.2013

Изменение ресурсов пути к классам либо сложно, либо невозможно... в зависимости от загрузчика классов и пути к классам.

  • Если ресурс пути к классам находится в каталоге файловой системы, вы сможете заменить его. Однако возможно, что файл заблокирован, и нет гарантии, что обновленный ресурс будет виден, пока вы не перезапустите JVM.

  • Если ресурс classpath находится в JAR или ZIP в локальной файловой системе, у вас есть пара дополнительных проблем:

    1. Вы не можете выполнить обновление на месте файла JAR или ZIP. Вам нужно будет создать новый ZIP/JAR и скопировать в него существующий контент.

    2. Файл ZIP или JAR в пути к классам будет заблокирован.

  • Если ресурс classpath находится в ZIP или JAR, который был загружен, будет невозможно (в общем) обновить файл в источнике... поэтому ваши изменения могут не «прилипнуть».

  • Если вы используете пользовательский загрузчик классов, все ставки отключены...

Короче говоря, лучше найти другой способ сделать это; например скопируйте/установите ресурсы в доступный для записи каталог в файловой системе и получите к ним доступ оттуда.

person Stephen C    schedule 10.09.2013

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

  1. Classloader никогда не даст вам дескриптор ресурса (находящегося внутри jar) в виде файла с путем к каталогу и всем остальным. Это потому, что Jar обычно не взрывается. Вам нужно, чтобы ваша банка была в разобранном виде, чтобы получить ресурс в виде файла.

  2. Когда вы запускаете свою программу, ваш текущий рабочий каталог может не совпадать с ресурсом/jar в пути к классам.

  3. Вам нужно выяснить каталог ресурса, а затем вы можете легко изменить или сделать то, что хотите.

  4. Один из способов сделать это — объявить путь к вашему ресурсу где-нибудь в настраиваемом файле. это очень простой подход.

  5. Другой способ - выяснить путь, используя логику. Один из таких примеров взят из эта ссылка

    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.
     }
    
person Gyanendra Dwivedi    schedule 10.09.2013