Ler Arquivo txt sempre que o conteúdo do mesmo for alterado. Similar ao Commons Configuration
2 respostas
paulo1911
Olá amigos, tenho pesquisado na web sobre a forma de carregar um arquivo sempre que o conteudo do mesmo for alterado.
Tendo o seguinte cenário:
Imagine que tenho um servlet que vai retornar o conteudo de um JavaScript.
Sabemos que java Script é cheio de caracteres especiais, principalmente se estiver ofuscado. No entanto o que eu preciso é algo similar ao commons configuration, onde no commons configuration eu tenho um properties que é carregado sempre que o conteudo do arquivo é alterado, semp recisar fazer re-deploy.
Por questão de performance nao posso ficar o tempo todo carregando esse file js, e também esse arquivo js pode sofrer mudanças.
Alguem conhece ou saberia indicar uma forma de quando o conteudo de um file for alterado automaticamente a aplicação faça o load desse file novamente?
Eu fiz uma implementação utilizando o próprio commons configuration. Pra compilar o código tem que adicionar as bibliotecas do commons configuration, do commons-lang versão 2.6 e do commons logging. Eu chamei a classe de ArquivoGeralConfiguration, já que ela utiliza o mesmo esquema das outras classes do commons configuration, exceto pelo fato do arquivo ser um arquivo texto comum e não um arquivo com algum formato específico:
importjava.io.File;importjava.io.IOException;importjava.io.Reader;importjava.io.Writer;importjava.net.URL;importorg.apache.commons.configuration.AbstractFileConfiguration;importorg.apache.commons.configuration.ConfigurationException;importorg.apache.commons.configuration.reloading.FileChangedReloadingStrategy;classArquivoGeralConfigurationextendsAbstractFileConfiguration{protectedStringBuildercache;publicArquivoGeralConfiguration(){super();// TODO Auto-generated constructor stub}publicArquivoGeralConfiguration(Filefile)throwsConfigurationException{super(file);// TODO Auto-generated constructor stub}publicArquivoGeralConfiguration(StringfileName)throwsConfigurationException{super(fileName);// TODO Auto-generated constructor stub}publicArquivoGeralConfiguration(URLurl)throwsConfigurationException{super(url);// TODO Auto-generated constructor stub}@Overridepublicsynchronizedvoidload(Readerreader)throwsConfigurationException{if(cache==null)cache=newStringBuilder();elsecache.delete(0,cache.length());char[]buffer=newchar[1024];intoffset=0;try{while((offset=reader.read(buffer))!=-1){cache.append(buffer);}}catch(IOExceptione){e.printStackTrace();thrownewConfigurationException(e);}}@Overridepublicsynchronizedvoidsave(Writerwriter)throwsConfigurationException{try{writer.write(cache.toString());writer.flush();}catch(IOExceptione){// TODO Auto-generated catch blocke.printStackTrace();thrownewConfigurationException(e);}}publicsynchronizedStringgetContent(){reload();returncache.toString();}}publicclassTesteArquivo{/** * @param args * @throws ConfigurationException */publicstaticvoidmain(String[]args)throwsConfigurationException{// TODO Auto-generated method stubArquivoGeralConfigurationconfig=newArquivoGeralConfiguration("/tmp/teste.txt");config.setReloadingStrategy(newFileChangedReloadingStrategy());while(true){try{System.out.println("------------------------Conteúdo------------------------");System.out.println(config.getContent());System.out.println("--------------------------------------------------------");Thread.sleep(10000);}catch(InterruptedExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}}
Até mais!
paulo1911
olá rogerio, muito obrigado pela ajuda.
Realmente é isso mesmo.
Tentei com o commons mas ele nao estava executando o load, mas eu achave que era por conta da extensao do arquivo, pois na documentação ele diz que aceita arquivos xlm,properties, mas nao arquivos txt ou js…
Eu estava vendo a API FileAlterationObserver da commons-io-monitor.