Pessoal,
Tenho um dataloger que me fornece dados a cada minuto, dai vc pode ver a quantidade de dados gerados. Sendo que só utilizo os úlltimos 20 dados para fazer um grafico.
Meu gráfico está perfeito sem problemas, mas esta ficando com delay devido a quantidade de dados que tem que filtrar a cada minuto. Como o lugar é remoto uso modem 2G e estou gastando sem necessidade os preciosos bites.
Minha intenção é gerar outro arquivo com somente os últimos 20 dados e ficar enviando esse arquivo.
Alguém pode me ajudar?
Obrigado a todos.
Artur
Pq vc não cria um arquivo novo, salva as ultimas 20 linhas e apaga o arquivo velho?
-
Eu preciso do arquivo completo como banco de dados.
-
Para enviar para o servidor só preciso dos ultimos 20 dados para fazer o grafico.
-
Se eu ficar fazendo isso manualmente deixa de ser viável.
-
O dataloger vai adicionando novas linhas no arquivo que existe.
O Wagner me passou uma dica usar o tail, sendo que é linux.
O tail mostra a quantidade de linhas que vc quer.
abs
Acho q ficou meio gambiarra. Mas funciona.
public static void leitura() {
File arquivoLeitura = new File("d:/temp/log.txt");
Date dateInicio = DateUtils.getDataAtual();
try {
FileReader fileReader = new FileReader(arquivoLeitura);
// LineNumberReader linhaLeitura = new LineNumberReader(fileReader);
// linhaLeitura.skip(arquivoLeitura.length());
// int qtdLinha = linhaLeitura.getLineNumber();
// System.out.println(qtdLinha);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line;
List<String> list = new ArrayList<String>();
while ((line = bufferedReader.readLine()) != null) {
list.add(line);
}
Collections.reverse(list);
for (int i = 0; i < 10; i++) {
System.out.println(list.get(i));
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
Date dateFim = DateUtils.getDataAtual();
System.out.println("Iniciou as : " + DateUtils.convertddMMyyyy_HHmmss(dateInicio));
System.out.println("Terminou as : " + DateUtils.convertddMMyyyy_HHmmss(dateFim));
}
}
public static String convertddMMyyyy_HHmmss(Date date) {
return convertDate("dd/MM/yyyy - HH:mm:ss", date);
}
public static String convertDate(String format, Date dtConsulta) {
try {
SimpleDateFormat formatter = new SimpleDateFormat(format, new Locale("pt", "BR"));
return formatter.format(dtConsulta);
} catch (Exception e) {
return null;
}
}
Testei com um arquivo com 199306 linhas e foi bem rapido, não levou 2 segundos. Claro, rodei localmente.
Sua intenção eu entendi. Mas qual é o seu problema? O que te impede de gerar um novo arquivo e envia-lo?
Nada me impede de todo dia, guardar o arquivo gerado, e começar um novo.
Mas vou ter que acessar todo dia a estação remota, ou outro prazo, fazer um backup do arquivo, renomear com uma data para fazer o banco de dados e apagar todos os dados desse arquivo enviado.
Vou ter que ficar fazendo intervenções na estação sem necessidade e ter vários arquivos. Posso tb ter um arquivo só e ficar copiando e colando.
Por isso eu quero automatizar completamente a estação, sem precisar fazer nada manualmente. Lembrando que a estação esta num lugar remoto, quanto menor intervenções melhor.
Estou fazendo um programa em javascript para fazer essa função, mas esta dando erro.
Acho que isto resolver seu problema de vez.
public static void leitura2() {
StringBuilder builder = new StringBuilder();
try {
File arquivoLeitura = new File("d:/temp/log.txt");
RandomAccessFile raf = new RandomAccessFile(arquivoLeitura, "r");
long ponteiro = raf.length() - 1 * 500;
if (ponteiro < 0) {
ponteiro = 0;
}
raf.seek(ponteiro);
String line = raf.readLine();
while ((line = raf.readLine()) != null) {
builder.append(line);
builder.append("\r\n");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
System.out.println(builder.toString());
}
Valeu vou fazer uns testes mas já deu uma ideia de como fazer.
Obrigado a todos,
Artur