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?

obrigado
Fallow

2 Respostas

rogeriopaguilar

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:

import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.net.URL;

import org.apache.commons.configuration.AbstractFileConfiguration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;


class ArquivoGeralConfiguration extends AbstractFileConfiguration {

	protected StringBuilder cache;

	public ArquivoGeralConfiguration() {
		super();
		// TODO Auto-generated constructor stub
	}

	public ArquivoGeralConfiguration(File file) throws ConfigurationException {
		super(file);
		// TODO Auto-generated constructor stub
	}

	public ArquivoGeralConfiguration(String fileName)
			throws ConfigurationException {
		super(fileName);
		// TODO Auto-generated constructor stub
	}

	public ArquivoGeralConfiguration(URL url) throws ConfigurationException {
		super(url);
		// TODO Auto-generated constructor stub
	}

	@Override
	public synchronized void load(Reader reader) throws ConfigurationException {
		if(cache == null) cache = new StringBuilder();
		else cache.delete(0, cache.length());
		
		char[] buffer = new char[1024];
		int offset = 0;
		try {
			while( ( offset = reader.read(buffer) ) != -1){
				cache.append(buffer);
			}
		} catch (IOException e) {
			e.printStackTrace();
			throw new ConfigurationException(e);			
		}
	} 

	@Override
	public synchronized void save(Writer writer) throws ConfigurationException {
		try {
			writer.write(cache.toString());
			writer.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new ConfigurationException(e);
		}
	}

	public synchronized String getContent() {
		reload();
		return cache.toString();
	}
	
}


public class TesteArquivo {

	/**
	 * @param args
	 * @throws ConfigurationException 
	 */
	public static void main(String[] args) throws ConfigurationException {
		// TODO Auto-generated method stub

		ArquivoGeralConfiguration config = new ArquivoGeralConfiguration("/tmp/teste.txt");
		config.setReloadingStrategy(new FileChangedReloadingStrategy());
		while(true){
			try {
				System.out.println("------------------------Conteúdo------------------------");
				System.out.println(config.getContent());
				System.out.println("--------------------------------------------------------");
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.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.

Valeu mesmo
Obrigado
Abraço

Criado 9 de novembro de 2011
Ultima resposta 9 de nov. de 2011
Respostas 2
Participantes 2