JAVA Unix'owy tail

0

Witam,

Mam za zadanie napisać program o funkcjonalności UNIX'owego Tail'a.
Nie wiem dlaczego, ale ten program nie działa jak powinien.
Proszę o pomoc

import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Timer;
import java.util.TimerTask;

public class Tail {
	private String nazwaPliku;
	private Timer t;
	private RandomAccessFile raf;
	private long rozmiarPliku = 0;
	private long wskaznikWPliku = 0;
	
	
	public Tail() {}
	
	public Tail(String n) {
		ustawNazwePliku(n);
	}
	
	public void ustawNazwePliku(String n) {
		nazwaPliku = (n != null ? n : "");
	}
	
	public void sprawdzaj() {
		t = new Timer();
		t.schedule(new Sprawdzacz(), 0, 10);
		Runtime.getRuntime().addShutdownHook(new Thread() {
			public void run() {
				t.cancel();
				System.out.println("koniec podgladania");
			}
		} );
	}
	
	private class Sprawdzacz extends TimerTask {
		public void run() {
			try {
				raf = new RandomAccessFile(nazwaPliku, "r");
				long obecnyRozmiarPliku = raf.length();
				if(obecnyRozmiarPliku == rozmiarPliku) {
					return;
				} else  if(obecnyRozmiarPliku < rozmiarPliku){
					System.out.println("Plik zostal obciety!!");
					rozmiarPliku = raf.length();
					wskaznikWPliku = rozmiarPliku - 1;
				} else {
					raf.seek(wskaznikWPliku);
					
					String linia;
					while((linia = raf.readLine()) != null) {
						System.out.println(linia);
					}
					
					rozmiarPliku = raf.length();
					wskaznikWPliku = raf.getFilePointer();
				}			
			} catch(IOException e) {
				System.err.println("Blad czytania pliku");
			} finally {
				if(raf != null) {
					try {
						raf.close();
					} catch (IOException e) {
						System.err.println("Nie mozna zamknac pliku");
						raf = null;
					}
				}
			}
		}
	}
	
	public static void main(String [] args) {
		if(args.length == 1) {
			Tail f = new Tail(args[0]);
			f.sprawdzaj();
		} else {
			System.out.println("Zle argumenty");
		}
	}
}
0

Ja się chciałem tylko zapytać, czemu to jest takie skomplikowane? Nie rozumiem czemu ma służyć ten Timer, rozumiem, że z jakiegoś powodu nie chcesz wypisywać całego pliku naraz.
Proponuję zamiast tego dziwacznego rozwiązania zastosować zwykłą pętlę z Thread.sleep(10), w ten sposób ustrzeżesz się przed problemami związanymi z synchronizacją timera (bo taka jest prawdopodobna przyczyna tego, że Twój kod nie działa).

0

@mariusz2108, ale w czym dokładnie jest problem?

0

Problem w tym, że nie mogę wprowadzać zmian w pliku tzn. próbuję coś dopisać, ale się nie zapisuje.
Problem jest na Mac'u, na Windows'ie działa poprawnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1