Avatar billede webster Nybegynder
03. september 2003 - 11:50 Der er 5 kommentarer og
1 løsning

Problem med PrintWriter og løbende gemme data i fil

Hejsa eksperter

Jeg har her i de sidste par dage arbejdet på at kode en irc bot, hvor en af bottens vigtige funktioner er at logge alt den trafik der foregår i en kanal. pt gør det det ved at åbne en printwriter for hver fil jeg ønsker at skrive til (en fil per kannal) som vist herunder:

  pw = new PrintWriter(new BufferedWriter(new FileWriter(f, true)), true);

hvor f er et File objekt, jeg skriver til writeren med denne metode:

    private void writeRawString(PrintWriter pw, String s){
    try{
        pw.write(s + (char)13 + (char)10);
    }catch (Exception e){
        System.out.println("Exception caught during attempt to print to log file. Printing stack trace");
        e.printStackTrace();
    }

Mit problem er at dataen tilsyneladende først "dukker op" i filen efter at programmet er lukket, og kun når det er lukket korrekt ned. Problemet ligger sikkert i den måde os'et (win2k) håndterer åbne filer, men jeg kan ikke lige komme på nogen god ide til hvordan jeg skal kode mig omkring det. At åbne/lukke en writer/stream for hver besked vil virke noget dumt.

Jeg vil lige prøve at indsætte en flush() og lade den køre noget tid, men jeg tror ikke det er løsningen da der i går blev logget så meget til en af chansne at den burde havde flushet adskillige gange.

Håber I har en god ide til hvordan en løsning kan udformes.
Avatar billede arne_v Ekspert
03. september 2003 - 11:57 #1
Hvis du kalder flush både på PrintWriter og den underliggende stream, så
skal der være indhold i filen uanset hvordan programmet lukkes.
Avatar billede arne_v Ekspert
03. september 2003 - 12:00 #2
Det er dog ikke det samme som at data vil være tilgængelige for
andre programmer førend at filen er lukket.

Og det kan stadigvæk gå galt hvis sytemer går ned.

Forklaring: operativ systemet kan også cache filen.
Avatar billede webster Nybegynder
03. september 2003 - 12:19 #3
Okay, er der nogen muligheder for at åbne filen på en sådan måde at andre programmer kan få adgang til dataen løbende? Jeg skal kunne hive logsne ud til bearbejdning engang imellem og det duer ikke at stoppe botten for det. Jeg kan selvf lukke/åbne streams like før jeg fetcher loggen men er en noget grim løsning.
Avatar billede arne_v Ekspert
03. september 2003 - 12:21 #4
Jeg kan se 2 fornuftige approaches:

1)  Hvert X. minut lukker du filen og åbner en ny fil med et andet
    navn (fil00001.log, fil00002.log ... eller lignende). Så kan de gamle
    filer processes.

2)  Du erstatter den flade fil med en databasen tabel (f.eks. MySQL).
Avatar billede arne_v Ekspert
03. september 2003 - 12:27 #5
Hvis du erstatter din egen log-kode med et logging framework
som f.eks. jakarta log4j, så er det utroligt nemt at lave den
slags.

Så kan man ændre den slags i en konfigurations-fil uden at
rette i sin kode.
Avatar billede webster Nybegynder
03. september 2003 - 13:17 #6
Jeg kommer nok til at bruge løsning 1 med at lukke, så copiere filen til et filnavn-process og genåbne. Logsne parses af et program jeg ikke har sourcen til så skal havde bestemt navn, format osv.

Takker for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester