2013-09-10 2 views
-4

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

+1

Я думаю, ваш вопрос очень абстрактно. Можете ли вы сделать это яснее? Может быть, фрагмент фрагмента кода даст больше контекста вашему вопросу? – thotheolh

+0

, если вам действительно необходимо изменить свою собственную банку, вы можете попробовать [http://stackoverflow.com/questions/2463785/modify-executing-jar-file] –

ответ

3

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

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

+0

+1 банки предназначены для ресурсов, которые не меняются. –

+0

благодарю вас за ваш ответ, у вас есть идея, как мы можем дать путь абзаца для файла synth xml (изменить внешний вид)? – user2763652

+0

@ user2763652 Посмотрите здесь, есть также пример того, как установить L & F http://en.wikipedia.org/wiki/Synth_Look_and_Feel – Matthias

2

Изменение ресурсов класса пути является трудным или невозможным ... в зависимости от класса loader и classpath.

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

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

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

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

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

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

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

0

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

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

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

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

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

  5. Другой способ - выяснить путь, используя логику. Одним из таких примеров взяты из 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. 
    } 
    

 Смежные вопросы

  • Нет связанных вопросов^_^