Estou escrevendo um substituto imediato para um aplicativo legado em Java. Um dos requisitos é que os arquivos ini que o aplicativo antigo usava sejam lidos no estado em que se encontram no novo aplicativo Java. O formato desses arquivos ini é o estilo comum do Windows, com seções de cabeçalho e pares chave = valor, usando # como caractere para comentários.
Tentei usar a classe Properties do Java, mas é claro que não funcionará se houver conflito de nomes entre cabeçalhos diferentes.
Então a questão é: qual seria a maneira mais fácil de ler esse arquivo INI e acessar as chaves?
IniFile
aula foi retirada, tenteIni ini = new Ini(new File("/path/to/file"));
Wini
classe, conforme ilustrado no tutorial "One Minute"; oprefs.node("something").get("val", null)
não funcionou da maneira que eu esperava.Como mencionado , ini4j pode ser usado para conseguir isso. Deixe-me mostrar outro exemplo.
Se tivermos um arquivo INI como este:
O seguinte deve ser exibido
value
para STDOUT:Verifique os tutoriais para mais exemplos.
fonte
Tão simples quanto 80 linhas:
fonte
Aqui está um exemplo simples, mas poderoso, usando a classe do apache HierarchicalINIConfiguration :
A configuração do Commons possui várias dependências de tempo de execução . No mínimo, commons-lang e commons-logging são necessários. Dependendo do que você está fazendo com ele, você pode precisar de bibliotecas adicionais (consulte o link anterior para obter detalhes).
fonte
Ou com a API Java padrão, você pode usar java.util.Properties :
fonte
Properties
classe não obtém adequadamente os valores que contêm \native2ascii
para outras codificações)Em 18 linhas, estendendo o
java.util.Properties
para analisar em várias seções:fonte
Outra opção é que o Apache Commons Config também possui uma classe para carregar de arquivos INI . Ele tem algumas dependências de tempo de execução , mas para arquivos INI, deve requerer apenas coleções Commons, lang e registro.
Usei Commons Config em projetos com suas propriedades e configurações XML. É muito fácil de usar e oferece suporte a alguns recursos bastante poderosos.
fonte
Você pode tentar o JINIFile. É uma tradução do TIniFile do Delphi, mas para java
https://github.com/SubZane/JIniFile
fonte
Eu pessoalmente prefiro Confucious .
É bom, pois não requer nenhuma dependência externa, é minúsculo - apenas 16K e carrega automaticamente seu arquivo ini na inicialização. Por exemplo
fonte
A solução da hoat4 é muito elegante e simples. Ele funciona para todos os arquivos ini sãos . No entanto, tenho visto muitos que possuem caracteres de espaço sem escape na chave .
Para resolver isso, baixei e modifiquei uma cópia do
java.util.Properties
. Embora isso seja um pouco heterodoxo e de curto prazo, os mods reais eram apenas algumas linhas e bastante simples. Apresentarei uma proposta à comunidade JDK para incluir as mudanças.Adicionando uma variável de classe interna:
Eu controlo o processamento relacionado à digitalização do ponto de separação de chave / valor. Substituí o código de pesquisa de caracteres de espaço por um pequeno método privado que retorna um booleano dependendo do estado da variável acima.
Este método é usado em dois locais dentro do método privado
load0(...)
.Também existe um método público para ativá-lo, mas seria melhor usar a versão original do
Properties
se o separador de espaço não for um problema para seu aplicativo.Se houver interesse, gostaria de postar o código em meu
IniFile.java
arquivo. Funciona com qualquer uma das versões doProperties
.fonte
Usando a resposta de @Aerospace, percebi que é legítimo que os arquivos INI tenham seções sem nenhum valor-chave. Nesse caso, a adição ao mapa de nível superior deve acontecer antes que qualquer valor-chave seja encontrado, por exemplo, (minimamente atualizado para Java 8):
fonte
É tão simples quanto isso ...
fonte