Ler arquivo txt sempre que houver alterações (JAVA)

4 respostas
A

Bom dia pessoal,
estou com um problema em um projeto que estou realizando, preciso fazer um programa que leia um arquivo txt e importe para o MySQL, consegui fazer até essa parte. Porém agora preciso que esse programa fique lendo esse arquivo txt sempre que houver mudanças. E que importe para o MySQL apenas os novos dados cadastrados. Alguém poderia me ajuda? Dando algumas dicas de estudos. Ou algum exemplo. Estou começando agora em java.
Obrigado.

4 Respostas

rmendes08

Nunca vi nada desse tipo. Geralmente quando se precisa fazer ETL agenda-se um determinado horário do dia e os arquivos são importados as-is.

H

Não sei se irá funcionar mas tenta deixar o arquivo aberto.
Faça um teste

aix

Ola @alex_inoue,

na API commons-io da Apache existe uma classe FileAlterationObserver que acredito que possa te ajudar, neste link tem um exemplo de como utilizar, ela vai te ajudar a identificar quando teve alteração no arquivo ainda assim precisara criar um algoritimo para identificar e processar as informações que foram adiconadas ou modificadas.

A

Boa tarde pessoal, consegui deixar o programa em tempo real com o JNotify, porém quando adiciono um dado no arquivo txt, o programa insere os dados anteriores e mais o novo dado no MySQL, como posso fazer para ele apenas adicionar o dado inserido. Obrigado.

public class Main {

public static void main(String[] args) {

        try {
              observarPasta();
        } catch (Exception e) {
              e.printStackTrace();
        }
  }

  public static void observarPasta() throws Exception {

      // criei uma pasta temp para observar os arquivos que forem
      // criados e alterados dentro dela, mas pode ser alterado
      // para um arquivo especifico

      String path = "c:\\Users\\solutel\\Documents\\tabela\\";

      // a mask é as ações que vão ser observadas, mas pode
      // ser utilizado JNotify.FILE_ANY para monitorar tudo
      // também.

      int mask = JNotify.FILE_CREATED  |
                 JNotify.FILE_DELETED  |
                 JNotify.FILE_MODIFIED |
                 JNotify.FILE_RENAMED;

      // monitorar subPastas?
      boolean watchSubtree = true;

      // adiciona o "MONITORADOR"
      int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener());

      //Fica esperando um tempo até terminar a aplicação
      //Dependendo da implementação da sua aplicação
      //isso não será necessário mas para esse teste é interessante
      Thread.sleep(1000000);

      // aqui remove o seu "MONITORADOR"
      boolean res = JNotify.removeWatch(watchID);

      if (!res) {
        // o id foi inválido.
      }
    }

      //essa implementação ja se explica com seus métodos
    static class Listener implements JNotifyListener {
      public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
        print("renomeado " + rootPath + " : " + oldName + " -> " + newName);
      }

      public void fileModified(int wd, String rootPath, String name) {
        print("modificado " + rootPath + " : " + name);
           try {   
     Class.forName("org.gjt.mm.mysql.Driver");   
     Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Radius","root","admin");   
     Statement stm = con.createStatement();   
     BufferedReader reader = new BufferedReader(new FileReader("c:\\Users\\solutel\\Documents\\tabela\\tabela.txt"));
    
     String dados[] = new String[3];         
     String linha = reader.readLine();   
     while (linha != null) {   
        StringTokenizer st = new StringTokenizer(linha,";\"");   
        dados[0] = st.nextToken();   
        dados[1] = st.nextToken();   
    
        stm.executeUpdate("insert into radcheck (username,attribute,op,value) values ('"+dados[0]+"','" +"User-Password"+ "','"+ ":="+ "','"+dados[1]+"')");   
        linha = reader.readLine();         
     }   
  }   
  catch (Exception e) {   
     System.err.println("Erro: " + e.getMessage());   
  }
      }

      public void fileDeleted(int wd, String rootPath, String name) {

        print("deletado " + rootPath + " : " + name);
      }

      public void fileCreated(int wd, String rootPath, String name) {

        print("criado " + rootPath + " : " + name);
      }

      void print(String msg) {
        System.err.println(msg);
      }
    }

}

Criado 8 de junho de 2016
Ultima resposta 8 de jun. de 2016
Respostas 4
Participantes 4