Como um aplicativo pode usar arquivos dentro do JAR para leitura e gravação?

Eu preciso armazenar dados em arquivos dentro do arquivo .jar e lê-lo novamente.

Eu sei que eu posso usar o método Class.getResourceAsStream() , mas ele retorna um InputStream que eu possa ler . Mas procuro uma maneira de escrever.

    Eu preciso armazenar dados em arquivos dentro do arquivo .jar e lê-lo novamente

    Não você não.

    Em vez disso, armazene o arquivo ‘default’ dentro do Jar. Se for alterado, armazene o arquivo alterado em outro lugar. Um lugar comum é um subdiretório de user.home . Ao verificar o arquivo, verifique primeiro a existência de um arquivo alterado no sistema de arquivos e, se ele não existir, carregue o arquivo padrão.


    Observe que geralmente é melhor descrever a meta, em vez da estratégia. ‘Armazenar arquivo alterado no Jar’ é uma estratégia, enquanto ‘Salvar preferências entre execuções’ pode ser o objective.

    Relacionado: Qual é o problema XY?

    Isso não é realmente suportado. Em princípio, você poderia operar no arquivo jar, mas não há garantia de que o novo conteúdo seria carregado corretamente. Deixe que suas ferramentas de construção gerenciem o arquivo jar – e escolha outra coisa para armazenamento persistente gerenciado pelo próprio programa. Como um arquivo.

    É improvável que você possa alterar um flask carregado com segurança. Alterá-lo enquanto estiver sendo usado não é uma boa ideia.

    Se você quiser fazer isso, use um diretório de sistema de arquivos simples e adicione / remova arquivos dele. Mesmo isso pode não funcionar como você espera.

    Você pode manipular qualquer arquivo jar usando o pacote java.util.jar (ou, na verdade, apenas java.util.zip ). Como os arquivos dentro de um flask serão compactados, essa não é a maneira mais eficiente de armazenar dados.

    Você provavelmente deve usar um diretório em outro lugar (por exemplo, System.getProperty("user.home") + "/.myProgram" ) ou veja java.util.prefs .

    Class.getResource() retorna um URL. Teoricamente, você pode usar esse URL para criar seu InputStream e OutputStream . Mas na maioria dos casos, o JAR gerado é um arquivo somente leitura (ou arquivo). Portanto, seu aplicativo pode atrapalhar ao tentar usá-lo.