Way per il programma java per leggere il file da quando è stato fermato

0

Sto lavorando su un'applicazione che legge un file di registro, cerca una stringa specifica, invia e-mail di avviso e salva i dati dal file in un database. La funzionalità di lettura sta funzionando bene, ma mi sto imbattendo in un problema quando mi fermo e riavvio il mio programma. Fondamentalmente, inizia sempre dall'inizio del file di log, quindi sto rileggendo le informazioni che ho già letto. Si prega di fare riferimento all'esempio qui sotto.

Considera che ho il file di registro con le seguenti righe

1 0708 1200 Error in log
2 0708 1230 Received invoice 00001
3 0708 1231 Received invoice 00002
4 0708 0130 Error in log 
5 0708 0135 Received invoice 00003
6 0708 0200 Received invoice 00004
7 0708 0230 Received invoice 00005
8 0708 0235 Error in log

In questo esempio, diciamo che ho eseguito l'applicazione. L'applicazione inizierà a leggere alla riga 1 e continuerà fino a quando non interromperò l'applicazione (prendendo le eventuali righe aggiunte al file). Diciamo che interrompo l'applicazione quando arrivo alla linea 5. Se fosse così, avrei ricevuto un'e-mail di avviso dalla riga 1 e dalla riga 4. Avrei anche salvato le righe 2 e 3 nel database.

Il mio problema / domanda proviene da quando voglio riavviare nuovamente l'applicazione. Attualmente, l'applicazione inizierà nuovamente a leggere alla riga 1. Questo non è un problema quando si tratta di salvare dati perché ho inserito una clausola per non salvare se la linea è già stata aggiunta. Tuttavia, quando si tratta di inviare e-mail, riceverò nuovamente un'e-mail per le righe 1 e 4.

Dopo tutto quel vagabondaggio, presenterò la mia domanda / domanda reale. C'è un modo per fermare un programma (interrompe completamente il processo) e iniziare a leggere dal punto in cui ho smesso di leggere? Non riesco a pensare a un modo per salvare il segnaposto per il file e usarlo una volta che riavvio il programma.

Ho preso in considerazione il salvataggio del valore del puntatore del file in un file di testo e la lettura da lì ad ogni avvio, ma mi chiedevo se c'era un altro modo o qualche suggerimento per migliorare questo processo. So che questa domanda è astratta, ma sto cercando di dare più cervello a questo problema.

Piccole informazioni:

  • Questo è un programma java
  • Questa è un'app Web in esecuzione su un server tomcat
  • Il server su cui è in esecuzione Tomcat è un server unix
  • Questa è un'applicazione in esecuzione costante che dovrebbe essere spenta solo durante un problema o una modifica
  • I log sottoposti a scansione sono molto grandi con oltre 500.000 righe
  • I registri si girano (vengono sostituiti con un log vuoto) una volta raggiunta una certa dimensione. Ciò significa che quando salgo il puntatore del file, devo assicurarmi di essere nello stesso file prima di iniziare a leggere di nuovo, altrimenti voglio ricominciare dall'inizio

Qualsiasi aiuto / suggerimento sarebbe molto utile. Ci scusiamo per la domanda prolissa, per favore fatemi sapere se qualcosa non è chiaro. Grazie!

    
posta user1998581 08.07.2014 - 18:27
fonte

2 risposte

1

Se fossi in te manterrei semplicemente un segnaposto in un file separato.

Se stai cercando alternative, potresti inserire un personaggio speciale direttamente nel registro. Come una bandiera / numero come la prima riga del registro che si aggiornerebbe dopo aver letto ogni riga. Se stai lavorando con diversi file, puoi controllare ciascun file per quel flag di prima riga o modificare il nome del file per indicare se è attualmente in uso o meno.

    
risposta data 08.07.2014 - 20:32
fonte
0

Uno dei modi in cui posso pensare è quello di memorizzare il numero di riga della lettura precedente e quindi iniziare da quella posizione, qualcosa del genere e continuare a leggere fino a eof.

public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader (new FileReader("Profiles.ini"));

String info = "";
int startLine = 17;
int endLine = 22; //EOF in your case

for (int i = 0; i < startLine; i++) { info = in.readLine(); }
   for (int i = startLine; i < endLine + 1; i++) {
       info = in.readLine();
       System.out.println(info);
   }

   in.close();
}

Ho ottenuto questo estratto da qui .

OR

Dai un'occhiata a questo thread: link

    
risposta data 08.07.2014 - 19:22
fonte

Leggi altre domande sui tag