Odczytywanie dynamicznie zmieniającego się pliku

0

Witam. Mój problem polega na odczytaniu pliku do którego jest coś cały czas dopisywane (zawsze na samym jego końcu). Fragment kodu:

[code]
FileInputStream br=new FileInputStream("csv");

		if(cursor>0) br.skip(cursor);
		int chars;
		while((chars=br.read())!=-1){
			cursor++;
			System.out.print((char)chars);

}
br.close();
[/code]

gdzie pole (cursor) klasy jest typu long. Plik próbuję odczytać raz na sekundę i jak widać na starcie ustawiam poprzednią pozycję kursora (jeżeli coś zostało dopisane do pliku to wpada w pętle i odczytuje nowe znaki).
Rozwiązanie działa prawie idealnie. Czasami, gdy plik się zmienia wyrzucany jest błąd:
[code]
java.io.FileNotFoundException: .goutputstream-45YWPV (No such file or directory)

at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:137)
at demon.Monitor.run(Monitor.java:52)

[/code]

Jeżeli raz wyrzuci błąd to ponawia go za każdym razem deklaracji FileInputStream. Poszukuję jak najbardziej wydajnego rozwiązania. Zawsze do pliku jest dopisywana pełna linijka kodu więc idealnym było by dla mnie rozwiązaniem blokady metody readLine() (czeka, nie zwaraca null) gdy w pliku przejechaliśmy wszystkie linijki i po pojawieniu się nowego wpisu readLine() zwraca nowe wartości i czeka na kolejne.

0

Poszukuję rozwiązania pod względem kodowym, nie binarki.

0

"The jar file contains the program and its source code." - więc można podejrzeć zastosowane rozwiązanie.

0

Sprawdziłem rozwiązanie z Jar'a i zastosowano tam identyczne rozwiązanie do mojego (tyle, że wykorzystali klase RandomAccessFile). Po podmianie na nową klasę efekt jest identyczny czyli wywala błąd o braku tymczasowego pliku przy częstym zapisywaniu pliku.

0

Może spróbuj otwarcie pliku oraz przewinięcie do zapisanego kursora wrzucić w osobną metodę (np. openLast), następnie
wrzuć br.read() do bloku try z łapaniem wyjątku java.io.FileNotFoundException w obsłudze którego wywołuj br.close() i ustaw jakąś flagę, że przed ponowną próbą odczytu najpierw wykonała się openLast().
A tak w ogóle, to samo new FileInputStream("csv") też powinno być sprawdzane pod względem wyjątków bo przecież plik może zostać w międzyczasie skasowany lub mogą zostać zabrane prawa dostępu. Również przed przewinięciem pliku powinno się najpierw sprawdzić czy jego bieżąca długość nie jest przypadkiem krótsza od zapisanego kursora. Kosztuje niewiele, ale jeden wyjątek wyeliminowany. Każdy porządny program powinien być na takie dziwy przygotowany.
Ważne też by nie robić piramid zagnieżdżonych try, a zamiast tego zamykać wszystko w metodach, które rzucą wyjątkiem, którego nie potrafią obsłużyć, a złapią te z którymi sobie same poradzą.

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