Riposto il codice, identato in modo da redere il tutto più leggibile:
Codice:
import java.io.*;
import java.lang.*;
import java.util.*;
class Log
{
public static void main (String args[])
{
int a=1;
char thischar=' '; //char per la lettura di un singolo carattere
String s=null; //string per la lettura di una linea
try
{
FileReader f = new FileReader("protezione2.txt");
BufferedReader fIN = new BufferedReader(f);
FileWriter f2 = new FileWriter("EventLog.txt",true);
PrintWriter fOUT = new PrintWriter(f2);
s=fIN.readLine();
System.out.println(s);
do
{
while(thischar!='?')
{
thischar=(char) fIN.read();
System.out.print(thischar);
if(thischar=='A') { //SE il carattere è 'A'
thischar=(char) fIN.read(); //leggi il carattere successivo
if(thischar=='d') { //SE il carattere successivo è 'd'
thischar=(char) fIN.read(); //leggi il carattere successivo
fOUT.println(s);
}
}
}
s=fIN.readLine();
}
while(s!=null);
}
catch(IOException e)
{
System.out.println("Si e' verificata un'eccezione "+e.getMessage());
}
}
}
Primo "problema" che salta all'occhio:
- sia che le operazioni di I/O vadano a buon fine oppure no, gli stream non vengono chiusi.
Invece per quanto riguarda il codice che rappresenta la logica di estrazione delle stringhe desiderate:
- notiamo che ogni stringa è formata sempre da 8 campi (Tipo,Data,Ora,Origine,Categoria,Evento,Utente,Computer) separati dal carette di virgola, e quello che ci interessa è il campo Utente (il settimo): quando è uguale alla stringa "Amministratore" l'intera riga letta va inserita nel nuovo file.
- potresti realizzare semplicemente la cosa usando un oggetto
java.util.Scanner che supporta il parsing di String mediante uno o più delimitatori personalizzabili: nel tuo caso, dato un oggetto String che rappresenta una riga del file di input, il delimitatore per il parsing è il carattere ','.
Come procederei io:
- tramite BufferedReader leggo tutte le righe del file di input e le salvo in un array di String; chiudo il file di input.
- creo una java.util.List<String> che conterrà le String da scrivere nel nuovo file di output.
- ciclo l'array di String, per ogni String nell'array: tramite uno Scanner (con delimitatore personalizzato sul carattere di virgola) faccio il parsing della String per prendere il settimo 'token' e confrontarlo con la String "Administrator": se è uguale allora lo aggiungo alla java.util.List<String>.
- ciclo la lista di String e tramite un PrintWriter le scrivo tutte sul file di output; chiudo il file di output.