Escrever em arquivo dentro do JAR

Olá.

Estou duas dúvidas com relação ao eu poder escrever em arquivos (que não são .class e nem .java, apenas um simples .txt) dentro do jar. Por que eu quero fazer isso? para eu poder editar um arquivo que o meu software precisa.

Estou utilizando a classe FIleOutPutStream do java.io, mas existem dois problemas.

1.Uso Linux e preciso executar o jar como super usuário para essa classe poder acessar o arquivo o arquivo, caso contrário ocorrem o erro de permissão negada (não uma exceção do Java, mas do próprio linux).

2.Mesmo executando como super usuário e não sendo lançada a exceção, não é escrito nada no arquivo dentro do Jar.

Abaixo esta o trecho de código que deveria salvar as informações no txt.

PS; O caminho do arquivo esta correto, estou utilizando o FileInputStream para ler desse mesmo arquivo e funciona normalmente.

    OutputStream gravador = null;

    try {
        gravador = new FileOutputStream(CAMINHO_ARQUIVO);

        for (int i = 0; i < gravar.length(); i++) {
            gravador.write(gravar.charAt(i));
        }

        gravador.flush();
        gravador.close();

    } catch (FileNotFoundException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao ler arquivo de dados!!\n" + ex.getMessage());
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao acessar arquivo!!\n" + ex.getMessage());
    }

Gravar é a String que eu vou salvar no txt.

Agradeço desde já.

Eu acho que diretamente dentro do jar não tem como. O jar é basicamente um arquivo compactado, talvez se você descompactasse ele, fizesse as alterações que precisa e compactasse novamente funcione, e digo TALVEZ porque não tenho certeza se isso realmente funciona. Dependendo do que você precisa editar seja mais interessante criar um arquivo de properties da sua aplicação, fora do jar, ou no caso de uma aplicação não-distribuída gravar no registro (preferences) seja lá o que você precisar gravar. Vai muito do tipo de dado que você quer gravar nesse TXT.

Para manipular entradas de ZIPs e/ou JARs existem as classes dos pacotes java.util.zip e java.util.jar.
basicamente você vai fazer o seguinte:

  • ler o conteúdo de um ZIPEntry ( ou JAREntry ) para a memória;
  • alterar o conteúdo em memória;
  • remover o ZIPEntry ( ou JAREntry );
  • readicionar o ZIPEntry ( ou JAREntry ) e gravar o novo conteúdo.