Witam, kolejne zadanie kolejny problem.
Potrzebuje zaczytać dane z pliku tekstowego, a następnie znaleźć wśród nich wyrażenia regularne (do tego momentu nie mam problemów). A następnie na podstawie odczytanej linii zainicjować konstruktor innej klasy... (i tu odpadam)
Ale po kolei:
Pierwszy krok - utwórz klasę wiadomość (jej pola i konstruktor). Klasę Wiadomość utworzyłem trochę okrojoną, wychodzę z założenia że jak rozwiąże problem inicjowania konstruktora linia odczytaną z pliku, to ją rozbuduje do pełnego wymiaru, tak jak jest wymagane w zadaniu).
Klasa Wiadomosc ma pola
int dzien;
int miesiac;
int rok;
String godzina;
//String user; - o to na razie sobie uprościłem
//String ip; - o to na razie sobie uprościłem
//String tekst; - o to na razie sobie uprościłem
public class Wiadomosc {
int dzien;
int miesiac;
int rok;
String godzina;
//String user;
//String ip;
//String tekst;
Wiadomosc(int dzien, int miesiac, int rok, String godzina){
this.dzien = dzien;
this.miesiac = miesiac;
this.rok = rok;
this.godzina = godzina;
}
}
Wczytaj zawartosc pliku serverLog.txt podziel dane tak, żeby kazda linia inicjowała wspomiany obiekt klasy Wiadomość...
W kolejnym kroku umieść obiekt w kolekcji ArrayList.
Na koniec mam utworzyć trzy metody do wświetlania wszystkich wiadomosci z danego dnia, miesiąca bądx adresu IP.
Przykładowe wiersze z pliku ServerLog.txt:
10 6/23/2006 809 AM - (not logged in) (10.0.2.143)> Connected, sending welcome message...
11 6/23/2006 809 AM - (not logged in) (10.0.2.143)> 220-FileZilla Server version 0.9.18 beta
public class WiadomoscTest {
public static void main(String[] args) {
ArrayList<String> lista = new ArrayList();
StringBuilder sb = new StringBuilder();
File file = new File("ServerLog.txt");
try{
FileInputStream fis = new FileInputStream(file);
int tmp;
while((tmp = fis.read()) != -1){
sb.append((char) tmp);
}
fis.close();
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
//poniżej okrojony pattern na dzien miesiac rok i godzine.
Pattern p = Pattern.compile("([0-9]{1,2})/([0-9]{2})/([0-9]{4}) (([0-9]{1,2}:){2}[0-9]{2} [A-Z]{2})");
Matcher m = p.matcher(sb.toString());
for(int i = 0;i <= lista.size();i++){
while(m.find()){
//poniżej mam błąd... czy jest możliwość uruchomienia w ten sposób niejako dynamicznie tworzonego konstruktora klasy Wiadomosc?
lista.add(new Wiadomosc("Int " + m.group(1) + "," + "Int " + m.group(2) + "," + "Int " + m.group(3) + "," + "String " + m.group(4)));// = m.group("wiadomosc");
System.out.println(lista.get(i));
}
}
}
}
Problem mam jak napisałem wyżej w komentarzu, z uruchomieniem konstruktora podając mu jako argumenty odczytane dane.
Pytanie do bardziej doświadczonych, czy dobrze kombinuje, czy to jest w ogóle ślepa uliczka i powinienem pójść w innym kierunku?
Jeżeli tak, to jak się powinno zgodnie ze sztuką rozwiązać taki problem?