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.
Ler arquivo txt sempre que houver alterações (JAVA)
4 Respostas
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.
Não sei se irá funcionar mas tenta deixar o arquivo aberto.
Faça um teste
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.
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);
}
}
}